chaitu
chaitu

Reputation: 719

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!

Upvotes: 1

Views: 6632

Answers (2)

jadkik94
jadkik94

Reputation: 7078

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.

Upvotes: 2

user1786283
user1786283

Reputation:

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()

Upvotes: 2

Related Questions