2012-12-07 56 views
0

我想寫一個python腳本到像matplotlib這樣的應用程序。 我需要一個函數調用來顯示Qt主窗口。我該怎麼做呢?要顯示一個函數內的PyQt主窗口

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 

我希望能夠在需要時調用窗口。 (像這樣)

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 

編輯:粘貼解決方案感謝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! 

回答

1

當一個函數內部使用,窗口不不顯示。問題很簡單:窗口是垃圾收集的,因爲它是在函數範圍內定義的,然後不再使用,所以Python將其視爲「垃圾」並刪除該對象。

我發現避免這種情況的最佳方式是讓應用程序類擁有對所有想顯示的窗口的引用。所以你可以讓一個普通班爲你做這個,或者如果你可以使用它,也可以繼承QtGui.QApplication。我會去第二個選擇。

如果你真的不想使用類,另一個選擇是將其設置爲全局變量,這通常會阻止它被Python垃圾收集。

+0

是的!子類化QApplication完成這項工作。謝謝。 – chaitu

+0

@chaitu Great :)這是最好的解決方案,因爲如果應用程序停止,QApplication將被刪除,否則它將保留,窗口也會保留。 – jadkik94

1

這是你想要的東西:

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

在你的代碼中,最後一行'a.show()'是多餘的。並且執行在'a = main()'後停止,在這之後嘗試打印一些東西 - 沒有任何反應,因爲python正在等待來自qt窗口的事件。這是我的問題。 – chaitu