程序启动时打开错误的window

The wrong window opens when the program starts

我正在制作一个 pyqt 程序来注册和授权用户。我想要一个开始 window 的按钮,单击这些按钮将打开授权 window 或注册 window。但是当我导入注册模块时,例如,注册 window 而不是主 window 打开。你能告诉我哪里做错了吗?

主模块:

from PyQt5 import QtWidgets, QtCore
from start import Ui_Form #py file with start window ui properties 
import registration #registration module
class StartWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(StartWindow, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.RegButton.clicked.connect(reg_clicked())
        self.openreg=registration.mywindow(self)
        #self.ui.AuthButton.clicked.connect()

    def reg_clicked(self):
        self.openreg.show()
        
app = QtWidgets.QApplication([])
application = StartWindow()
application.show()
sys.exit(app.exec())

部分注册模块:

from PyQt5 import QtWidgets, QtCore
import record_proc
from reg import Ui_Reg

class mywindow(QtWidgets.QMainWindow):
    number_of_samples=1
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_Reg()
        self.ui.setupUi(self)
        self.ui.RecordButton.clicked.connect(self.Recording)
        self.ui.AuthButton.clicked.connect(self.Register)
        self.ui.CheckLogin.clicked.connect(self.CheckLogin)
app2 = QtWidgets.QApplication([])
application2 = mywindow()
application2.show()
sys.exit(app2.exec())

你的错误是混合了可执行代码和库代码。

当你import registration 在您的主模块中,这将执行 registration.py 文件。 这意味着它将 运行 该文件中的每一行代码,包括 application2.show()sys.exit()。这意味着 import registration 步骤永远不会完成,因为导入它的行为 运行s application2.show(),它会阻塞,直到您关闭注册 window。然后,它会运行sys.exit(),退出程序。

我猜您的意图是注册模块的最后四行只有在您手动 运行 脚本时才会执行,以进行测试。 python 中内置了一种机制,即 if __name__ == "__main__" 机制。

这应该可以修复您的代码:

主模块:

from PyQt5 import QtWidgets, QtCore
from start import Ui_Form #py file with start window ui properties 
import registration #registration module
class StartWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(StartWindow, self).__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.RegButton.clicked.connect(reg_clicked())
        self.openreg=registration.mywindow(self)
        #self.ui.AuthButton.clicked.connect()

    def reg_clicked(self):
        self.openreg.show()
        
def main():
    app = QtWidgets.QApplication([])
    application = StartWindow()
    application.show()
    sys.exit(app.exec())

if __name__ == "__main__":
    main()

注册模块:

from PyQt5 import QtWidgets, QtCore
import record_proc
from reg import Ui_Reg

class mywindow(QtWidgets.QMainWindow):
    number_of_samples=1
    def __init__(self):
        super(mywindow, self).__init__()
        self.ui = Ui_Reg()
        self.ui.setupUi(self)
        self.ui.RecordButton.clicked.connect(self.Recording)
        self.ui.AuthButton.clicked.connect(self.Register)
        self.ui.CheckLogin.clicked.connect(self.CheckLogin)

def main():
    app2 = QtWidgets.QApplication([])
    application2 = mywindow()
    application2.show()
    sys.exit(app2.exec())

if __name__ == "__main__":
    main()

其背后的原因是,每当您 运行 直接使用 python3 file.py 一个 python 文件时,变量 __name__ 将设置为 "__main__" 以发出信号它现在被执行的文件。所以 __name__ == "__main__" 不是 hack,而是官方的 python 机制。

有关详细信息,请阅读:https://docs.python.org/3/library/__main__.html