【问题标题】:The wrong window opens when the program starts [duplicate]程序启动时打开错误的窗口[重复]
【发布时间】:2021-04-12 13:47:54
【问题描述】:

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

主模块:

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())

【问题讨论】:

  • registration.py 中删除最后四行或将它们放在if __name__ == "__main__": 块中。如果您导入一个模块,则会读取并执行所有相应的 .py 文件。在这种情况下,当您导入registration 时,您的registration.py 文件中的最后四行将创建一个QApplication 实例,创建并显示一个注册窗口并启动事件循环。

标签: python python-3.x pyqt pyqt5


【解决方案1】:

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

当你做import registration 在您的主模块中,它将执行registration.py 文件。 这意味着它将运行该文件中的每一行代码,包括application2.show()sys.exit()。这意味着import registration 步骤永远不会完成,因为导入它的行为会运行application2.show(),它会一直阻塞,直到您关闭注册窗口。然后,它将运行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

【讨论】:

  • 准确地说,sys.exit() 在“第二个”窗口关闭之前不会退出,因为它被 app.exec_() 阻止,这会启动 Qt 事件循环(并实际显示窗口) .
  • 你是对的。
  • 重新措辞以使其更清晰。
  • 非常感谢!
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多