【问题标题】:Load other windows when button clicked. PyQt单击按钮时加载其他窗口。 PyQt
【发布时间】:2014-02-19 22:12:42
【问题描述】:

我正在尝试使用 PyQt4 从 python 2.7 中的按钮单击调用另一个窗口。下面的代码会打开 AddBooking 对话框,但会立即将其关闭。我是 Gui 编程新手,谁能告诉我我的代码有什么问题?

from PyQt4 import QtGui
from HomeScreen import Ui_HomeScreen
from AddBooking import Ui_AddBooking
import sys

class HomeScreen(QtGui.QWidget, Ui_HomeScreen):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)
        self.show()
        self.Add_Booking_Button.clicked.connect(self.handleButton)

    def handleButton(self):
        AddBooking2()


class AddBooking2(QtGui.QWidget, Ui_AddBooking):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.setupUi(self)
        self.show()

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

【问题讨论】:

    标签: python python-2.7 window pyqt4


    【解决方案1】:

    不要使用多重继承,也不要在类初始化器中调用show 函数。问题是您使用AddBooking2() 创建的对象是一个临时对象,并且在函数结束时会自动销毁。因此,您需要使用一些变量来引用该对象,例如:

    addbooking = AddBooking2()
    addbooking.show()
    

    此外,由于您使用的是QtDesignerpyuic4 工具,因此您可以更轻松地进行连接。也就是说,你的代码可以修改:

    from PyQt4 import QtGui
    from PyQt4.QtCore import pyqtSlot
    from HomeScreen import Ui_HomeScreen
    from AddBooking import Ui_AddBooking
    import sys
    
    class HomeScreen(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.ui = Ui_HomeScreen()
            self.ui.setupUi(self)
    
        @pyqtSlot("")
        def on_Add_Booking_Button_clicked(self): # The connection is carried by the Ui_* classes generated by pyuic4
            addbooking = AddBooking2()
            addbooking.show()
    
    
    class AddBooking2(QtGui.QWidget):
        def __init__(self, parent=None):
            QtGui.QWidget.__init__(self, parent)
            self.ui = Ui_AddBooking()
            self.ui.setupUi(self)
    
    
    if __name__ == '__main__':
        app = QtGui.QApplication(sys.argv)
        window = HomeScreen()
        window.show()
        sys.exit(app.exec_())
    

    【讨论】:

      【解决方案2】:

      对话框会立即关闭,因为您没有保留对它的引用,因此一旦超出范围就会被垃圾回收。

      修复它的最简单方法是执行以下操作:

          def handleButton(self):
              self.dialog = AddBooking2()
              self.dialog.show()
      

      您还可以从AddBooking2.__init__HomeScreen.__init__ 中删除self.show() 行,它们是多余的。除此之外,您的代码看起来还不错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-18
        • 2012-06-02
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 2013-06-21
        相关资源
        最近更新 更多