首页 > 解决方案 > 如何将 python 脚本连接到 PyQt5 中的按钮?

问题描述

我试图为桌面应用程序创建一个 GUI,并且从一个窗口我想将其中一个按钮连接到另一个脚本,实际上它工作正常,除了负责在 update_window.py 中处理第二个窗口“exit_popup_message”的函数,所以我成功运行第一个文件并单击“更新用户”按钮,它成功运行第二个窗口,但是每当我在第二个窗口中单击退出时,它就会崩溃并出现此错误:

进程以退出代码 -1073740791 (0xC0000409) 结束

更新窗口.py:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import QDate
import sys
class Ui_UpdatePage(object):
   def setupUi(self, UpdatePage):

       #Update page
       UpdatePage.setObjectName("UpdatePage")
       UpdatePage.setEnabled(True)
       UpdatePage.setFixedSize(400, 350)
       sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
       sizePolicy.setHorizontalStretch(0)
       sizePolicy.setVerticalStretch(0)
       sizePolicy.setHeightForWidth(UpdatePage.sizePolicy().hasHeightForWidth())
       UpdatePage.setSizePolicy(sizePolicy)
       font = QtGui.QFont()
       font.setPointSize(10)
       UpdatePage.setFont(font)
       UpdatePage.setFocusPolicy(QtCore.Qt.StrongFocus)
       icon = QtGui.QIcon()
       icon.addPixmap(QtGui.QPixmap("D:/FIU/Graduation project/covid_tracer/regist_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
       UpdatePage.setWindowIcon(icon)
       UpdatePage.setWindowOpacity(100.0)
       UpdatePage.setAutoFillBackground(True)
       UpdatePage.setDocumentMode(True)
       UpdatePage.setTabShape(QtWidgets.QTabWidget.Rounded)
       self.centralwidget = QtWidgets.QWidget(UpdatePage)
       self.centralwidget.setObjectName("centralwidget")
       self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
       self.verticalLayoutWidget.setGeometry(QtCore.QRect(40, 20, 320, 300))
       self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
       self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
       self.verticalLayout.setContentsMargins(0, 0, 0, 0)
       self.verticalLayout.setObjectName("verticalLayout")
       self.formLayout = QtWidgets.QFormLayout()
       self.formLayout.setObjectName("formLayout")


       #Registration Form Label
       self.reg_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(20)
       font.setBold(True)
       font.setWeight(75)
       self.reg_label.setFont(font)
       self.reg_label.setLayoutDirection(QtCore.Qt.LeftToRight)
       self.reg_label.setAlignment(QtCore.Qt.AlignCenter)
       self.reg_label.setObjectName("reg_label")
       self.formLayout.setWidget(1, QtWidgets.QFormLayout.SpanningRole, self.reg_label)


       #ID Number
       self.id_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.id_label.setFont(font)
       self.id_label.setObjectName("id_label")
       self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.id_label)
       self.id_input = QtWidgets.QLineEdit(self.verticalLayoutWidget)
       self.id_input.setStyleSheet("id_input->rgb(191, 126, 255)")
       self.id_input.setFrame(True)
       self.id_input.setEchoMode(QtWidgets.QLineEdit.Normal)
       self.id_input.setCursorPosition(0)
       self.id_input.setDragEnabled(False)
       self.id_input.setReadOnly(False)
       self.id_input.setClearButtonEnabled(False)
       self.id_input.setObjectName("id_input")
       self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.id_input)


       #Phone Number
       self.phone_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.phone_label.setFont(font)
       self.phone_label.setObjectName("phone_label")
       self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.phone_label)
       self.phone_input = QtWidgets.QLineEdit(self.verticalLayoutWidget)
       self.phone_input.setObjectName("phone_input")
       self.formLayout.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.phone_input)


       #Name & Surname
       self.name_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.name_label.setFont(font)
       self.name_label.setObjectName("name_label")
       self.formLayout.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.name_label)
       self.name_input = QtWidgets.QLineEdit(self.verticalLayoutWidget)
       self.name_input.setObjectName("name_input")
       self.formLayout.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.name_input)

       self.SuName_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.SuName_label.setFont(font)
       self.SuName_label.setObjectName("SuName_label")
       self.formLayout.setWidget(8, QtWidgets.QFormLayout.LabelRole, self.SuName_label)
       self.SuName_input = QtWidgets.QLineEdit(self.verticalLayoutWidget)
       self.SuName_input.setObjectName("SuName_input")
       self.formLayout.setWidget(8, QtWidgets.QFormLayout.FieldRole, self.SuName_input)

       #Date of birth
       self.DOB_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.DOB_label.setFont(font)
       self.DOB_label.setObjectName("DOB_label")
       self.formLayout.setWidget(9, QtWidgets.QFormLayout.LabelRole, self.DOB_label)
       self.DOB_input = QtWidgets.QDateEdit(self.verticalLayoutWidget)
       self.DOB_input.setObjectName("DOB_input")
       self.formLayout.setWidget(9, QtWidgets.QFormLayout.FieldRole, self.DOB_input)


       #Gender
       self.G_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.G_label.setFont(font)
       self.G_label.setObjectName("gender")
       self.formLayout.setWidget(11, QtWidgets.QFormLayout.LabelRole, self.G_label)
       self.gender = QtWidgets.QComboBox(self.verticalLayoutWidget)
       self.gender.setObjectName("gender")
       self.gender.addItem("")
       self.gender.addItem("")
       self.formLayout.setWidget(11, QtWidgets.QFormLayout.FieldRole, self.gender)


       #Registration Date
       self.regiDate_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(10)
       self.regiDate_label.setFont(font)
       self.regiDate_label.setObjectName("registrationDate_label")
       self.formLayout.setWidget(12, QtWidgets.QFormLayout.LabelRole, self.regiDate_label)
       self.regiDate_input = QtWidgets.QDateEdit(self.verticalLayoutWidget)
       self.regiDate_input.setObjectName("regiDate_input")
       self.formLayout.setWidget(12, QtWidgets.QFormLayout.FieldRole, self.regiDate_input)



       self.horizontalLayout = QtWidgets.QHBoxLayout()
       self.horizontalLayout.setObjectName("horizontalLayout")


       #Save button
       self.b1_save = QtWidgets.QPushButton(self.verticalLayoutWidget)
       self.b1_save.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
       self.b1_save.setStyleSheet("")
       self.b1_save.setObjectName("b1_save")
       self.horizontalLayout.addWidget(self.b1_save)
       self.b1_save.clicked.connect(self.save_data)
       self.b1_save.setDefault(False);
       self.b1_save.setAutoDefault(True);


       #exit button
       self.b2_exit = QtWidgets.QPushButton(self.verticalLayoutWidget)
       self.b2_exit.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
       self.b2_exit.setObjectName("b2_cansel")
       self.horizontalLayout.addWidget(self.b2_exit)
       self.b2_exit.clicked.connect(self.exit_popup_message)
       self.b2_exit.setDefault(False);
       self.b2_exit.setAutoDefault(True);


       self.formLayout.setLayout(16, QtWidgets.QFormLayout.SpanningRole, self.horizontalLayout)
       spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
       self.formLayout.setItem(15, QtWidgets.QFormLayout.LabelRole, spacerItem)
       self.verticalLayout.addLayout(self.formLayout)
       UpdatePage.setCentralWidget(self.centralwidget)
       self.menubar = QtWidgets.QMenuBar(UpdatePage)
       self.menubar.setGeometry(QtCore.QRect(0, 0, 398, 21))
       self.menubar.setObjectName("menubar")
       UpdatePage.setMenuBar(self.menubar)

       self.retranslateUi(UpdatePage)
       QtCore.QMetaObject.connectSlotsByName(UpdatePage)
       UpdatePage.setTabOrder(self.id_input, self.phone_input)
       UpdatePage.setTabOrder(self.phone_input, self.name_input)
       UpdatePage.setTabOrder(self.name_input, self.SuName_input)
       UpdatePage.setTabOrder(self.SuName_input, self.DOB_input)
       UpdatePage.setTabOrder(self.DOB_input, self.gender)
       UpdatePage.setTabOrder(self.gender, self.regiDate_input)
       UpdatePage.setTabOrder(self.regiDate_input, self.b1_save)
       UpdatePage.setTabOrder(self.b1_save, self.b2_exit)


   def retranslateUi(self, UpdatePage):
       _translate = QtCore.QCoreApplication.translate
       UpdatePage.setWindowTitle(_translate("RegisterPage", "Update Form"))
       self.reg_label.setText(_translate("RegisterPage", "User Update Form"))
       self.id_label.setText(_translate("RegisterPage", "ID Number"))
       self.phone_label.setText(_translate("RegisterPage", "Phone Number"))
       self.name_label.setText(_translate("RegisterPage", "Name"))
       self.SuName_label.setText(_translate("RegisterPage", "Surname"))
       self.DOB_label.setText(_translate("RegisterPage", "Date Of Birth"))
       self.G_label.setText(_translate("RegisterPage", "Gender"))
       self.gender.setItemText(0, _translate("RegisterPage", "Male"))
       self.gender.setItemText(1, _translate("RegisterPage", "Female"))
       self.regiDate_label.setText(_translate("RegisterPage", "Registration Date"))
       self.b1_save.setText(_translate("RegisterPage", "Save"))
       self.b2_exit.setText(_translate("RegisterPage", "Exit"))


   #Saving the input data
   def save_data (self):
       if self.id_input.text() == "" or self.phone_input.text() == "" or self.name_input.text() == "" or self.SuName_input.text() == "":
           msg = QMessageBox()
           msg.setWindowTitle("Warning!")
           msg.setText("All fields must be filled!")
           msg.setIcon(QMessageBox.Warning)
           msg.setStandardButtons(QMessageBox.Ok)
           x = msg.exec_()
       else:
           ID = self.id_input.text()
           Phone = self.phone_input.text()
           Name = self.name_input.text()
           SurName = self.SuName_input.text()
           date = self.DOB_input.date().toPyDate()
           Gender = self.gender.currentText()
           RegiDate = self.regiDate_input.date().toPyDate()

           print(ID, Phone, Name, SurName, date, Gender, RegiDate)
           msg = QMessageBox()
           msg.setWindowTitle("Confirmation")
           msg.setText("Data saved successfully!")
           msg.setIcon(QMessageBox.Information)
           x = msg.exec_()
           if x == QMessageBox.Ok:
               self.id_input.clear()
               self.phone_input.clear()
               self.name_input.clear()
               self.SuName_input.clear()
               self.DOB_input.setDate(QDate(2000, 1, 1))
               self.regiDate_input.setDate(QDate(2000, 1, 1))


   #Exit the window
   def exit_popup_message (self):
       msg = QMessageBox()
       msg.setWindowTitle("Warning")
       msg.setText("Are you sure you want to exit?")
       msg.setIcon(QMessageBox.Question)
       msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
       x = msg.exec_()
       if x == msg.Yes:
           UpdatePage.close()


if __name__ == "__main__":
   app = QtWidgets.QApplication(sys.argv)
   UpdatePage = QtWidgets.QMainWindow()
   ui = Ui_UpdatePage()
   ui.setupUi(UpdatePage)
   UpdatePage.show()
   sys.exit(app.exec_())

用户信息.py:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox
from update_window import Ui_UpdatePage
import sys
import update_window



class Ui_User_Info(object):
   def setupUi(self, User_Info):
       # User info page
       User_Info.setObjectName("User_Info")
       User_Info.setWindowModality(QtCore.Qt.NonModal)
       User_Info.setFixedSize(522, 422)
       User_Info.statusBar().setSizeGripEnabled(False)
       sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Maximum)
       sizePolicy.setHorizontalStretch(0)
       sizePolicy.setVerticalStretch(0)
       sizePolicy.setHeightForWidth(User_Info.sizePolicy().hasHeightForWidth())
       User_Info.setSizePolicy(sizePolicy)
       icon = QtGui.QIcon()
       icon.addPixmap(QtGui.QPixmap("D:/FIU/Graduation project/covid_tracer/user_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
       User_Info.setWindowIcon(icon)


       self.centralwidget = QtWidgets.QWidget(User_Info)
       self.centralwidget.setObjectName("centralwidget")
       self.verticalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
       self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 0, 501, 191))
       self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
       self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
       self.verticalLayout.setContentsMargins(0, 0, 0, 0)
       self.verticalLayout.setObjectName("verticalLayout")
       self.horizontalLayout = QtWidgets.QHBoxLayout()
       self.horizontalLayout.setObjectName("horizontalLayout")

       # ID Number
       self.id_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.id_label.setFont(font)
       self.id_label.setObjectName("id_label")
       self.horizontalLayout.addWidget(self.id_label)
       self.id_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.id_output.setObjectName("id_output")
       self.horizontalLayout.addWidget(self.id_output)

       # Phone Number
       self.Ph_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.Ph_label.setFont(font)
       self.Ph_label.setObjectName("Ph_label")
       self.horizontalLayout.addWidget(self.Ph_label)
       self.Ph_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.Ph_output.setObjectName("Ph_output")
       self.horizontalLayout.addWidget(self.Ph_output)
       self.verticalLayout.addLayout(self.horizontalLayout)
       self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
       self.horizontalLayout_4.setObjectName("horizontalLayout_4")

       # Name & Surname
       self.name_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.name_label.setFont(font)
       self.name_label.setObjectName("name_label")
       self.horizontalLayout_4.addWidget(self.name_label)
       self.name_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.name_output.setObjectName("name_output")
       self.horizontalLayout_4.addWidget(self.name_output)

       self.SuName_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.SuName_label.setFont(font)
       self.SuName_label.setObjectName("SuName_label")
       self.horizontalLayout_4.addWidget(self.SuName_label)
       self.SuName_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.SuName_output.setObjectName("SuName_output")
       self.horizontalLayout_4.addWidget(self.SuName_output)
       self.verticalLayout.addLayout(self.horizontalLayout_4)
       self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
       self.horizontalLayout_5.setObjectName("horizontalLayout_5")

       # Gender
       self.G_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.G_label.setFont(font)
       self.G_label.setObjectName("G_label")
       self.horizontalLayout_5.addWidget(self.G_label)
       self.G_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.G_output.setObjectName("G_output")
       self.horizontalLayout_5.addWidget(self.G_output)

       # Date Of Birth
       self.DOB_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.DOB_label.setFont(font)
       self.DOB_label.setObjectName("DOB_label")
       self.horizontalLayout_5.addWidget(self.DOB_label)
       self.DOB_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.DOB_output.setObjectName("DOB_output")
       self.horizontalLayout_5.addWidget(self.DOB_output)
       self.verticalLayout.addLayout(self.horizontalLayout_5)
       self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
       self.horizontalLayout_10.setObjectName("horizontalLayout_10")

       # Registration Date
       self.regiDate_label = QtWidgets.QLabel(self.verticalLayoutWidget)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.regiDate_label.setFont(font)
       self.regiDate_label.setObjectName("regiDate_label")
       self.horizontalLayout_10.addWidget(self.regiDate_label)
       self.regiDate_output = QtWidgets.QLabel(self.verticalLayoutWidget)
       self.regiDate_output.setObjectName("regiDate_output")
       self.horizontalLayout_10.addWidget(self.regiDate_output)

       spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
       self.horizontalLayout_10.addItem(spacerItem)
       self.verticalLayout.addLayout(self.horizontalLayout_10)
       self.horizontalLayoutWidget_4 = QtWidgets.QWidget(self.centralwidget)
       self.horizontalLayoutWidget_4.setGeometry(QtCore.QRect(10, 210, 501, 141))
       self.horizontalLayoutWidget_4.setObjectName("horizontalLayoutWidget_4")
       self.horizontalLayout_8 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_4)
       self.horizontalLayout_8.setContentsMargins(0, 0, 0, 0)
       self.horizontalLayout_8.setObjectName("horizontalLayout_8")
       self.verticalLayout_2 = QtWidgets.QVBoxLayout()
       self.verticalLayout_2.setObjectName("verticalLayout_2")

       # PCR History
       self.PCR_label = QtWidgets.QLabel(self.horizontalLayoutWidget_4)
       font = QtGui.QFont()
       font.setPointSize(12)
       font.setBold(True)
       font.setWeight(75)
       self.PCR_label.setFont(font)
       self.PCR_label.setObjectName("PCR_label")
       self.verticalLayout_2.addWidget(self.PCR_label)
       spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
       self.verticalLayout_2.addItem(spacerItem1)

       # Add Reocrd Button
       self.b1_add = QtWidgets.QPushButton(self.horizontalLayoutWidget_4)
       self.b1_add.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
       self.b1_add.setObjectName("b1_add")
       self.verticalLayout_2.addWidget(self.b1_add)
       spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
       self.verticalLayout_2.addItem(spacerItem2)
       self.horizontalLayout_8.addLayout(self.verticalLayout_2)

       # PCR Table
       self.PCR_Table = QtWidgets.QTableWidget(self.horizontalLayoutWidget_4)
       self.PCR_Table.setObjectName("PCR_Table")
       self.PCR_Table.setColumnCount(2)
       self.PCR_Table.setRowCount(0)
       item = QtWidgets.QTableWidgetItem()
       self.PCR_Table.setHorizontalHeaderItem(0, item)
       item = QtWidgets.QTableWidgetItem()
       self.PCR_Table.setHorizontalHeaderItem(1, item)
       self.horizontalLayout_8.addWidget(self.PCR_Table)
       self.horizontalLayoutWidget_5 = QtWidgets.QWidget(self.centralwidget)
       self.horizontalLayoutWidget_5.setGeometry(QtCore.QRect(40, 350, 441, 51))
       self.horizontalLayoutWidget_5.setObjectName("horizontalLayoutWidget_5")
       self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget_5)
       self.horizontalLayout_9.setContentsMargins(0, 0, 0, 0)
       self.horizontalLayout_9.setObjectName("horizontalLayout_9")

       # Update Button
       self.b2_update = QtWidgets.QPushButton(self.horizontalLayoutWidget_5)
       self.b2_update.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
       self.b2_update.setObjectName("b2_update")
       self.horizontalLayout_9.addWidget(self.b2_update)
       self.b2_update.clicked.connect(self.update_button)

       # Remove Button
       self.b3_remove = QtWidgets.QPushButton(self.horizontalLayoutWidget_5)
       self.b3_remove.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
       self.b3_remove.setObjectName("b3_remove")
       self.horizontalLayout_9.addWidget(self.b3_remove)

       # Exit Button
       self.b4_exit = QtWidgets.QPushButton(self.horizontalLayoutWidget_5)
       self.b4_exit.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
       self.b4_exit.setObjectName("b4_exit")
       self.horizontalLayout_9.addWidget(self.b4_exit)
       self.b4_exit.clicked.connect(self.exit_popup_message)

       User_Info.setCentralWidget(self.centralwidget)
       self.statusbar = QtWidgets.QStatusBar(User_Info)
       self.statusbar.setObjectName("statusbar")
       User_Info.setStatusBar(self.statusbar)

       self.retranslateUi(User_Info)
       QtCore.QMetaObject.connectSlotsByName(User_Info)


   def retranslateUi(self, User_Info):
       _translate = QtCore.QCoreApplication.translate
       User_Info.setWindowTitle(_translate("User_Info", "User Information"))
       self.id_label.setText(_translate("User_Info", "ID Number:"))
       self.id_output.setText(_translate("User_Info", "- - - - - - - - - -"))
       self.Ph_label.setText(_translate("User_Info", "Phone Number:"))
       self.Ph_output.setText(_translate("User_Info", "- - - - - - - - - - "))
       self.name_label.setText(_translate("User_Info", "Name:"))
       self.name_output.setText(_translate("User_Info", "- - - - - - - - - - "))
       self.SuName_label.setText(_translate("User_Info", "Surname:"))
       self.SuName_output.setText(_translate("User_Info", "- - - - - - - - - - "))
       self.G_label.setText(_translate("User_Info", "Gender:"))
       self.G_output.setText(_translate("User_Info", "- - - - - - - - - - "))
       self.DOB_label.setText(_translate("User_Info", "Date Of Birth:"))
       self.DOB_output.setText(_translate("User_Info", "- - - - - - - - - - "))
       self.regiDate_label.setText(_translate("User_Info", "Registration Date:"))
       self.regiDate_output.setText(_translate("User_Info", "- - - - - - - - - - "))
       self.PCR_label.setText(_translate("User_Info", "PCR History:"))
       self.b1_add.setText(_translate("User_Info", "Add PCR Record"))
       item = self.PCR_Table.horizontalHeaderItem(0)
       item.setText(_translate("User_Info", "Test Date"))
       item = self.PCR_Table.horizontalHeaderItem(1)
       item.setText(_translate("User_Info", "Result"))
       self.b2_update.setText(_translate("User_Info", "Update User"))
       self.b3_remove.setText(_translate("User_Info", "Remove User"))
       self.b4_exit.setText(_translate("User_Info", "Exit"))

       self.id_output.setText("1603010021")
       self.Ph_output.setText("+905428769636")
       self.name_output.setText("Osama")
       self.SuName_output.setText("Abdelgawad")
       self.G_output.setText("Male")
       self.DOB_output.setText("1996-17-05")
       self.regiDate_output.setText("2021-04-09")

   def exit_popup_message(self):
       msg = QMessageBox()
       msg.setWindowTitle("Warning")
       msg.setText("Are you sure you want to exit?")
       msg.setIcon(QMessageBox.Question)
       msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
       x = msg.exec_()
       if x == msg.Yes:
           User_Info.close()

   def update_button (self):
       self.window = QtWidgets.QMainWindow()
       self.ui = Ui_UpdatePage ()
       self.ui.setupUi(self.window)
       self.window.show()


if __name__ == "__main__":
   app = QtWidgets.QApplication(sys.argv)
   User_Info = QtWidgets.QMainWindow()
   ui = Ui_User_Info()
   ui.setupUi(User_Info)
   User_Info.show()
   sys.exit(app.exec_())

标签: pythonpyqt5

解决方案


每当有疑问时,我建议您尝试从终端/提示符运行您的程序,因为 IDE 倾向于隐藏错误的完整回溯。

在这种情况下,它将如下所示:

Traceback (most recent call last):
  File "/tmp/update_window.py", line 250, in exit_popup_message
    UpdatePage.close()
NameError: name 'UpdatePage' is not defined

这是由两个问题引起的,一个是严格的程序问题,另一个是概念问题。

当您运行update_window.py文件时,if __name__语句中的块被执行(因为__name__is '__main__')并且从那时UpdatePage起存在,它可以正常工作。请注意,这UpdatePage是一个全局变量,应始终避免使用全局变量。
相反,当您运行该user_info.py文件时,只会执行该文件,而if __name__忽略另一个文件,然后UpdatePage不存在,引发异常并导致崩溃。

另一个问题与您正在编辑生成的文件有关,pyuic并且正如这些文件标题中的警告明确指出的那样,除非您真的知道自己在做什么,否则不应修改这些文件,并且其中之一阻止这种做法(这被认为是不好的做法)的许多原因是它通常会导致对对象结构的误解,就像您的情况一样。这些文件仅用于导入,很少有特殊情况可以考虑对其进行修改但一般规则是,如果您知道自己在做什么,就不会这样做。

pyuic 构建的 UI 的任何实现都应该通过继承其相应的 QWidget(在您的情况下为 QMainWindow)并使用生成的 UI 类在其上构建 ui 来完成。这不仅简化和澄清了事情,而且还允许正确访问实例方法,例如close(),而不是尝试以错误的方式做事(如访问全局)。我不会深入探讨这一切是如何工作的,但概念是使用您的方法,self在所有这些方法中,都指的是 的实例Ui_UpdatePage,而在正确的方法中,它指的是实际的主窗口对象。

所以,简而言之,用 pyuic 重新生成你的 ui 文件(在下面的摘录中,我生成了文件update_ui.pyuser_ui.py,然后将方法实现到正确的子类:

update_window.py

from PyQt5 import QtCore, QtGui, QtWidgets
from update_ui import Ui_UpdatePage

class UpdatePage(QtWidgets.QMainWindow, Ui_UpdatePage):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

   def save_data (self):
        # ...

   def exit_popup_message (self):
       # ...
       if x == msg.Yes:
           self.close()

user_info.py

from PyQt5 import QtCore, QtGui, QtWidgets
from update_window import UpdatePage
from user_ui import Ui_User_Info

class UserInfo(QtWidgets.QMainWindow, Ui_User_Info):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

   def exit_popup_message(self):
        # ...
       if x == msg.Yes:
           self.close()

   def update_button(self):
       self.window = UpdatePage()
       self.window.show()

if __name__ == "__main__":
   app = QtWidgets.QApplication(sys.argv)
   userInfo = UserInfo()
   userInfo.show()
   sys.exit(app.exec_())

要了解有关上述用法的更多信息,请阅读有关使用 Designer的官方指南。


推荐阅读