无法在PyQt5中打开多个窗口

时间:2016-03-30 17:15:04

标签: python pyqt pyqt4 pyqt5

所以我使用PyQt设计师制作了几个GUI,我的目标是让每个人彼此联系,并让他们能够互相打开。我已经启动了打开主页的启动页面,但是当我单击主页上的相应按钮打开其他页面时,它会崩溃我的程序。任何帮助解决这个问题都将非常感激。

我的代码如下:

import sys
from PyQt5 import QtGui, QtCore, QtWidgets
from StartupPage import Ui_StartupWindow
from HomePage import Ui_HomeWindow
from FoodPage import Ui_FoodWindow
from ExercisePage import Ui_ExerciseWindow
from ProfilePage import Ui_ProfileWindow

class Startup(QtWidgets.QMainWindow, Ui_StartupWindow):
    def __init__(self, parent=None):
        super(Startup, self).__init__(parent)
        self.setupUi(self)
        self.NewEntryButton.clicked.connect(self.NewButtonHandle)
        self.ContinueButton.clicked.connect(self.ContinueButtonHandle)
        self.HomeP=Home()

    def NewButtonHandle(self):
        self.HomeP.show()

    def ContinueButtonHandle(self):
        self.HomeP.show()

class Home(QtWidgets.QMainWindow, Ui_HomeWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)
        self.FoodP=Food()
        self.ExerciseP=Exercise()
        self.ProfileP=Profile()
        self.exerciseButton.clicked.connect(self.ExerciseButtonHandle)
        self.foodButton.clicked.connect(self.FoodButtonHandle)
        self.profileButton.clicked.connect(self.ProfileButtonHandle)

    def ExerciseButtonHandle():
        self.ExerciseP.show()

    def FoodButtonHandle():
        self.FoodP.show()

    def ProfileButtonHandle():
        self.ProfileP.show()

class Food(QtWidgets.QMainWindow, Ui_FoodWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)

class Exercise(QtWidgets.QMainWindow, Ui_ExerciseWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)

class Profile(QtWidgets.QMainWindow, Ui_ProfileWindow):
    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)
        self.setupUi(self)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = Startup()
    window.show()
    sys.exit(app.exec_())

3 个答案:

答案 0 :(得分:0)

尝试将import sys移至:

if __name__ == '__main__':
    import sys  """<--------------------------here"""
    app = QtWidgets.QApplication(sys.argv)
    window = Startup()
    window.show()
    sys.exit(app.exec_())

尝试检查其他人是否导入此类模块。

答案 1 :(得分:0)

试试这个:

import Homepage                    #import the whole thing

然后:

class Home(QtWidgets.QMainWindow, Homepage.Ui_HomeWindow):
      #import the UI there

答案 2 :(得分:0)

了解程序崩溃时显示的错误消息可能很有用。

话虽如此,我最近在摆弄类似的东西,但下面似乎工作得很好。请注意,它与您正在做的大致相同。

另外,当我的任何一个子窗口(window1,window2,window3)打开时,我想阻止与主(home)窗口的交互,以强制用户一次关注一个任务而不是打开多个窗口 - 因此setEnabled()调用。在

self.Window1.setEnabled(True)
home.toWindow1()中需要

行,因为Window1是home的成员,因此第一次setEnabled调用会导致所有其他home成员被禁用。

另外,虽然我确实把我的

import sys
在Volodymyr建议的主要方法中,这只是为了整洁。如果导入是代码的第一行或主方法中的第一行,那么对sys的引用也将解析(范围规则,LEGB),我不知道如何在任一位置使用它可能导致任何问题(除非它是在文件的开头导入的,然后变量sys被分配了不同的值)。

我也没有看到改变进口,正如Bahnzo建议的那样

from HomePage import Ui_HomeWindow

import HomePage

然后稍后将Ui_HomeWindow称为HomePage.Ui_HomeWindow会有任何不同,出于同样的原因 - 唯一的情况是,如果Ui_homePage在导入发生后以及在类中使用它之前显式赋予了某个值定义 - 你可以看到在OP的代码中没有发生。

#!/bin/python3

from PyQt5.QtWidgets import QApplication, QMainWindow
from startwindow import Ui_startWindow
from homewindow import Ui_homeWindow
from window1 import Ui_Window1
from window2 import Ui_Window2
from window3 import Ui_Window3


class start(QMainWindow, Ui_startWindow):
    def __init__(self):
        super(start, self).__init__(None)
        self.setupUi(self)
        self.homeButton.clicked.connect(self.toHome)
        self.home = home()

    def toHome(self):
        self.home.show()
        self.hide()

class home(QMainWindow, Ui_homeWindow):
    def __init__(self):
        super(home, self).__init__(None)
        self.setupUi(self)
        self.window1Button.clicked.connect(self.toWindow1)
        self.window2Button.clicked.connect(self.toWindow2)
        self.window3Button.clicked.connect(self.toWindow3)
        self.Window1 = window1(self)
        self.Window2 = window2(self)
        self.Window3 = window3(self)

    def toWindow1(self):
        self.Window1.show()
        self.setEnabled(False)
        self.Window1.setEnabled(True)

    def toWindow2(self):
        self.Window2.show()
        self.setEnabled(False)
        self.Window2.setEnabled(True)

    def toWindow3(self):
        self.Window3.show()
        self.setEnabled(False)
        self.Window3.setEnabled(True)

    def reEnable(self):
        self.setEnabled(True)

class window1(QMainWindow, Ui_Window1):
    def __init__(self, home):
        super(window1, self).__init__(home)
        self.home = home
        self.setupUi(self)
        self.homeButton.clicked.connect(self.toHome)

    def toHome(self):
        self.home.setEnabled(True)
        self.hide()


class window2(QMainWindow, Ui_Window2):
    def __init__(self, home):
        super(window2, self).__init__(home)
        self.home = home
        self.setupUi(self)
        self.homeButton.clicked.connect(self.toHome)

    def toHome(self):
        self.home.setEnabled(True)
        self.hide()

class window3(QMainWindow, Ui_Window3):
    def __init__(self, home):
        super(window3, self).__init__(home)
        self.home = home
        self.setupUi(self)
        self.homeButton.clicked.connect(self.toHome)

    def toHome(self):
        self.home.setEnabled(True)
        self.hide()