pyqt5如何打开新窗口并重新打开旧

时间:2019-10-25 12:12:44

标签: python python-3.x menu pyqt5

  

你好   我不知道该怎么办,窗口( register.py )从 login.py 打开得很好,但是窗口( login.py >)由于 register.py 而无法打开。

该怎么办?

  

register.py

https://hastebin.com/oyoxoyemak.rb

  

login.py

https://hastebin.com/tanuhigome.rb

error code

如果我删除错误代码

        screen = app.primaryScreen()
        size = screen.size()
        print('Size: %d x %d' % (size.width(), size.height()))
        rect = screen.availableGeometry()
        print('Available: %d x %d' % (rect.width(), rect.height()))
        self.window.move((rect.width() / 2) - 230, (rect.height() / 2) - 230)

error code 2

1 个答案:

答案 0 :(得分:0)

两个问题都与范围有关。 app是两个脚本中的局部变量,仅存在于正在运行的脚本范围内(if __name__ == "__main__":行)。 因此,如果您运行login.py,则app在其作用域中可用,但是如果您运行register.py app仅对其存在,而在login.py范围中则不存在(因为它从未创建“那里”)。

由于primaryScreen是静态函数,因此您无需引用该应用程序实例(无论如何,您都可以通过QtWidgets.QApplication.instance()获得该引用):

只需将该行更改为:

    screen = QtWidgets.QApplication.primaryScreen()

在第二个问题中,问题类似:由于您正在运行login.py,因此MainWindow_Register从未在register.py中声明。

我还没有一个“简单”的解决方案,因为您的方法有点困惑。
首先,似乎您正在尝试从pyuic的输出开始使程序无效,如果是这种情况,则应避免使用:编写自己的代码,并按照{{3 }}。
然后,每当您必须面对多个相关窗口时,最好避免“递归”调用自己,而将单个窗口(或更好的是,一个单独的对象,甚至是QApplication的子类)用作“管理器”。这样可以通过编程使一切变得更容易,避免了冗余代码,同时减少了发生错误的可能性。

以您为例,您应该始终将登录窗口用作“起点”,然后在必要时显示一个注册器。