简体   繁体   中英

To show PyQt main window inside a function

I am trying to write a python script to an application like matplotlib. I need a function call to show the Qt main window. How do I do this?

class MainWindow(QtGui.QMainWindow):
    def __init__(self,parent=None):
       super(MainWindow, self).__init__(parent)
       self.setupUi(self)
       self.numbers = 4
       ...

app = QtGui.QApplication(sys.argv)
dmw = DesignerMainWindow()
dmw.show()
sys.exit(app.exec_()) #this works, but pops the window right away

I want to be able to call the window when I wish instead. (Something like this)

def newWin():
    app = QtGui.QApplication(sys.argv)
    dwm = MainWindow()
    sys.exit(app.exec_())
    return dwn

a = newWin()    # application is created now
a.numbers = 10  # do something
a.show()        # should pop me the window now

EDIT : Pasting solution thanks to jadkik94

class App(QtGui.QApplication):
    def __init__(self, args):
        QtGui.QApplication.__init__(self,args)
        self.window = MainWindow()

    def doSomething(self, ii):
        self.window.numbers = ii

    def show(self):
        self.window.show()
        sys.exit(self.exec_())
a = App(sys.argv)
a.doSomething(12) #updates numbers alternately a.window.numbers = 12
a.show()          #pops the window!

Is this what you want:

import sys
from PyQt4 import QtGui


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Icon')        
        self.show()

def main():    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

a = main()
a.show()

When used inside a function, the window does not show. The problem is simple: the window is garbage collected because it is defined inside the scope of the function, and then not used anymore, so Python sees it as "garbage" and deletes the object.

The best way I found of avoiding that is having an application class that will hold references to all the windows you want to show. So you can either have a regular class do that for you, or subclass the QtGui.QApplication if you can make use of it otherwise too. I would go for the second option.

Another option, if you really don't want to be using a class, is to set it to a global variable, and that will usually prevent it from being garbage-collected by Python.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM