主程序工作得很好,但是当它放入一个函数中时不起作用pyQt



我在PyQt中有一个mainWindowFrame,在我的main程序中,我有以下代码:

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
Frame = QtGui.QFrame()
ui = Ui_Frame()
ui.setupUi(Frame)
Frame.show()    
sys.exit(app.exec_())

上面的代码,显示一个主窗口和一个帧,

我创建了一个类来实现我的程序:

class ShowHide(object):
    def __init__(self):
        pass
    def showFrameMaterials(self):
        Frame = QtGui.QFrame()
        ui = Ui_Frame()
        ui.setupUi(Frame)
        Frame.show()
        print "it's debugging"
    def showMainWindow(self):
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()

这导致我有两个函数,我调用showMainWindow()showFrameMaterials(),然后我更改了主函数,如:

obj = ShowHide()
obj.showMainWindow()
obj.showFrameMaterials()
sys.exit(app.exec_())

但我没有看到任何窗口,我回到代码中,将mainwindow的代码放入主程序中,并调用showFrameMaterials(),例如:

    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    obj = ShowHide()
    obj.showMainWindow()
    obj.showFrameMaterials()
    sys.exit(app.exec_())

但我只看到主窗口。。。

问题:我的问题在哪里

您在基于类的版本中没有看到任何窗口,因为函数调用finalize和PyQt对象正在被垃圾收集。在第一种简单的情况下,包含PyQt对象的变量在持续时间内保持在作用域中。

在这种简单的情况下,看到这一点的最简单方法是将PyQt对象存储在实例变量中,即self.Frameself.MainWindow中,以保留对对象的引用,这样Python就不会垃圾收集它们。

一般来说,您不会以这种方式使用PyQt。您可以对相关对象进行子类化,并在初始化程序中进行设置。

最新更新