单击按钮时加载其他窗口。 PyQt的

时间:2014-01-28 14:37:55

标签: python python-2.7 window pyqt4

我试图使用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_())

2 个答案:

答案 0 :(得分:0)

不要使用多继承,也不要在类初始值设定项中调用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_())

答案 1 :(得分:0)

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

解决问题的最简单方法是执行以下操作:

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

您还可以从self.show()AddBooking2.__init__中删除HomeScreen.__init__行,这些行是多余的。除此之外,您的代码看起来很好。