1

matplotlibのようなアプリケーションにPythonスクリプトを書き込もうとしています。Qtのメインウィンドウを表示するには関数呼び出しが必要です。どうすればよいですか?

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!
4

2 に答える 2

2

これは、あなたの望むことですか:

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()
于 2012-12-07T19:50:45.067 に答える
2

関数内で使用すると、ウィンドウは表示されません。問題は単純です。ウィンドウは関数のスコープ内で定義されているためガベージコレクションされ、その後は使用されなくなります。そのため、Pythonはウィンドウを「ガベージ」と見なし、オブジェクトを削除します。

それを回避するための最良の方法は、表示したいすべてのウィンドウへの参照を保持するアプリケーションクラスを用意することです。したがって、通常のクラスにそれを実行させるか、それ以外の方法で使用できる場合はサブクラス化するQtGui.QApplicationことができます。私は2番目のオプションに行きます。

クラスを本当に使用したくない場合の別のオプションは、クラスをグローバル変数に設定することです。これにより、通常、Pythonによるガベージコレクションが防止されます。

于 2012-12-07T20:04:34.017 に答える