Skip to content

两个qt界面的调用

主窗口

继承主界面

from management_UI import Ui_MainWindow

from new_page_connect import SecondWindow

class recognize_figure(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.Ui_Window = SecondWindow()

def new_page(self):
    # 打开子界面
    self.Ui_Window.show()
    self.Ui_Window.sure.clicked.connect(self.close_page)

def close_page(self):
    # 关闭子界面
    self.Ui_Window.close()

再写一个.py文件

主要是为了继承qt界面的类。

(直接放主文件调用 self.Ui_Window.show()操作会报错,没有这个属性)

from new_page import Ui_Window
from PyQt5 import QtCore
from PyQt5.QtWidgets import QMainWindow

class SecondWindow(QMainWindow, Ui_Window):
    def __init__(self):
        super(SecondWindow, self).__init__()
        self.setupUi(self)

添加一个小窗口

    # QMbox = QtWidgets.QMessageBox()
    # QMbox.setText("请输入书名")
    # QMbox.exec_()

想截图_2024070522531

查询数据库表里的所有数据

一定要加上 cursor.close() db.close() 关闭游标,和数据库。否则会因为连接池过多导致卡顿

def select_sql(self):
    db = self.connect_sql()
    cursor = db.cursor()
    sql = "SELECT * FROM book_info"
    try:
        cursor.execute(sql)
        result = cursor.fetchall()
        print("查询结果:", result)
        # 将查询结果插入到tableWidget里
        for row in result:
            self.tableWidget.insertRow(self.tableWidget.rowCount())
            for i in range(len(row)):
                self.tableWidget.setItem(self.tableWidget.rowCount() - 1, i,
                                         QtWidgets.QTableWidgetItem(str(row[i])))
    except pymysql.Error as e:
        print(f"数据库查询失败: {e}")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("数据库查询失败")
    finally:
        cursor.close()
        db.close()

单个数据查询

def select_one_sql(self):
    bookname = self.bookname.text()
    print(bookname)
    db = self.connect_sql()
    cursor = db.cursor()
    # 通过bookname或者bookid查询
    sql = "SELECT * FROM book_info WHERE bookname = %s "
    # 将查询结果覆盖到tableWidget里
    if self.bookname.text() == "":
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("请输入书名")
        # QMbox = QtWidgets.QMessageBox()
        # QMbox.setText("请输入书名")
        # QMbox.exec_()
        return
    else:
        cursor.execute(sql, bookname)
        result = cursor.fetchone()  # 获取查询结果的第一行
        print("查询结果:", result)
        # 将查询结果到覆盖到tableWidget里
        if result is None:
            self.new_page()
            # 在label控件中显示提示信息
            self.Ui_Window.show_text.setText("没有该书")
            return
        else:
            for i in range(len(result)):
                self.tableWidget.setItem(0, i, QtWidgets.QTableWidgetItem(str(result[i])))
            print("查询成功")
            self.new_page()
            # 在label控件中显示提示信息
            self.Ui_Window.show_text.setText(f"查询成功 书名: {result[0]}, 书号: {result[1]}")
            cursor.close()
            db.close()
            return

插入数据

def insert_sql(self):

    db = self.connect_sql()
    cursor = db.cursor()
    bookname = self.bookname.text()
    bookid = self.bookid.text()

    sql = "INSERT INTO library(bookname, bookid) VALUES ('{}', '{}')".format(bookname, bookid)
    if bookname == "" or bookid == "":
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("请输入书名和书号")
        return
    try:
        cursor.execute(sql)
        db.commit()
        print("数据插入成功")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText(f"数据插入成功 书名: {bookname}, 书号: {bookid}")

        # 将数据插入到tableWidget里
        self.tableWidget.insertRow(self.tableWidget.rowCount())
        self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 0, QtWidgets.QTableWidgetItem(bookname))
        self.tableWidget.setItem(self.tableWidget.rowCount() - 1, 1, QtWidgets.QTableWidgetItem(bookid))
    except pymysql.Error as e:
        print(f"数据库插入失败: {e}")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("数据库插入失败")
    finally:
        cursor.close()
        db.close()

删除数据

def delete_sql(self):
    db = self.connect_sql()
    cursor = db.cursor()
    # 将tableWidget里的数据提取出来,然后删除数据库里的数据
    current_row = self.tableWidget.currentRow()
    bookname_item = self.tableWidget.item(current_row, 0)
    bookid_item = self.tableWidget.item(current_row, 1)

    if bookname_item is None or bookid_item is None:
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("将鼠标移到需要删除的书")
        return

    bookname = bookname_item.text()
    bookid = bookid_item.text()
    sql = "DELETE FROM library WHERE bookname = %s AND bookid = %s"
    print(f"删除书名: {bookname}, 书号: {bookid}")

    try:
        cursor.execute(sql, (bookname, bookid))
        db.commit()
        print("数据删除成功")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText(f"数据删除成功 书名: {bookname}, 书号: {bookid}")
        # 将数据从tableWidget里删除
        self.tableWidget.removeRow(current_row)
    except pymysql.Error as e:
        print(f"数据库删除失败: {e}")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("数据库删除失败")
    finally:
        cursor.close()
        db.close()

更新数据

def update_sql(self):
    db = self.connect_sql()
    cursor = db.cursor()
    # 查询数据库里的所有数据,并且将数据提取出来与tableWidget里的数据进行遍历,如果一致,则不更新数据库,否则更新数据库
    # 先查询数据库里的数据
    sql = "SELECT * FROM library"
    try:
        cursor.execute(sql)
        result = cursor.fetchall()
        self.result = result
        print("查询结果:", result)
    except pymysql.Error as e:
        print(f"数据库查询失败: {e}")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("数据库查询失败")

    # 遍历tableWidget里的数据,如果一致,则不更新数据库,否则更新数据库
    # 所有更新的书名和对应的书号
    new_bookname_bookid = []
    for i in range(self.tableWidget.rowCount()):
        print(f"第{i}行数据")
        bookname = self.result[i][0]
        bookid = self.result[i][1]
        new_bookname = self.tableWidget.item(i, 0).text()
        new_bookid = self.tableWidget.item(i, 1).text()
        # print(f"数据库里的书名: {bookname}, 数据库里的书号: {bookid}")
        # print(f"tableWidget里的书名: {new_bookname}, tableWidget里的书号: {new_bookid}")

        if new_bookname == bookname and new_bookid == bookid:
            print("数据一致,不更新数据库")

        else:
            print("数据不一致,更新数据库")

            sql = "UPDATE library SET bookname = %s, bookid = %s WHERE bookname = %s AND bookid = %s"
            try:
                cursor.execute(sql, (new_bookname, new_bookid, bookname, bookid))
                db.commit()
                new_bookname_bookid.append((new_bookname, new_bookid))
                print("数据更新成功")

            except pymysql.Error as e:
                print(f"数据库更新失败: {e}")
                self.new_page()
                # 在label控件中显示提示信息
                self.Ui_Window.show_text.setText("数据库更新失败")

    if len(new_bookname_bookid) == 0:
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText("数据一致,不更新数据库")
    else:
        print(f"更新的书名和对应的书号: {new_bookname_bookid}")
        self.new_page()
        # 在label控件中显示提示信息
        self.Ui_Window.show_text.setText(f"数据更新成功 书名: {new_bookname_bookid}")

    cursor.close()
    db.close()

主函数部分

QGuiApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)

使窗口大小适应每个电脑(因为电脑分辨率问题)

app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())

给窗口包装成深色

想截图_2024070522531

if __name__ == "__main__":
    import sys

    QGuiApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)

    app = QtWidgets.QApplication(sys.argv)
    #使用 qdarkstyle

    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
    MainWindow = recognize_figure()
    MainWindow.show()
    # 调用select_sql方法
    MainWindow.select_sql()
    sys.exit(app.exec_())