0

ネストされたクラス/スレッドと複数のモジュールを含む大規模なプログラムを作成しました。簡単な GUI といくつかのラベルを追加して、いくつかの変数を表示したいと思います。ただし、変数はモジュールとクラス全体に散らばっています。現在のコードをあまり変更せずに、これらの変数を GUI に更新する方法を探しています。

私は Pyqt4 の基本的な理解を持っています (tkinter の回答も受け入れます)。

私の知る限り、エミットはQthreadから送信する必要があるため、シグナル/エミットを使用しないようにしました。これは、コードを完全にオーバーホールし、クラスとスレッドをQthreadsに変更することを意味します。可能であれば、これを行う必要は避けたいと思います。これは私が試みた一例です。

test.py

class Update(Thread): 
    def __init__(self): 
        Thread.__init__(self) 
    def run(self): 

        for i in range(10): 
            time.sleep(2) 
            import test 
            wa.label.setText(str(i)) 

class MyWindow(QWidget):  
    def __init__(self, *args):  
        QWidget.__init__(self, *args) 

        self.label = QLabel(" ") 
        layout = QVBoxLayout() 
        layout.addWidget(self.label) 
        self.setLayout(layout) 

        Update1 = Update() 
        Update1.start() 
        Update1.refresh1 = 'ba' 

        self.label.setText(Update1.refresh1) 


if __name__ == "__main__":  
    app = QApplication(sys.argv)  
    wa = MyWindow()  
    wa.show()  
    sys.exit(app.exec_()) 

このコードは機能しますが、変数を他のモジュール/クラスまたはスレッドから更新する必要があります。「クラス更新」を次のような新しいモジュールに移動した瞬間:

test.py

import test2 


class MyWindow(QWidget):  
    def __init__(self, *args):  
        QWidget.__init__(self, *args) 

        self.label = QLabel(" ") 
        layout = QVBoxLayout() 
        layout.addWidget(self.label) 
        self.setLayout(layout) 

        Update1 = test2.Update() 
        Update1.start() 
        Update1.refresh1 = 'ba' 

        self.label.setText(Update1.refresh1) 


if __name__ == "__main__":  
    app = QApplication(sys.argv)  
    wa = MyWindow()  
    wa.show()  
    sys.exit(app.exec_()) 

test2.py #更新 GUI

class Update(Thread): 
    def __init__(self): 
        Thread.__init__(self) 
    def run(self): 

        for i in range(10): 
            time.sleep(2) 
            import test 
            test.wa.label.setText(str(i)) 

私は得る:AttributeError: 'module' object has no attribute 'wa'

また、クラス Update() を Qthread に入れ、変数が更新された任意のモジュール/クラスから実行し、Update() 内で発行関数を使用することも検討していました。これにより、現在のクラス/スレッドを Qthreads に変更する必要がなくなります。

update() のようなクラスを呼び出すだけでGUIを更新できる簡単な方法を誰かが知っていれば、例をいただければ幸いです

4

1 に答える 1

0

waはメインファイルの場合にのみ設定され、それはメインファイルの__name__ == "__main__"場合にのみ発生するためtest.pyです。

実行すると、メイン スクリプトではないファイルのimport test別のインスタンスが実行されます。したがって、が設定されていたとしても、別のインスタンスを変更することになります。test.py__name__ == 'test'__main__wa

考えられる解決策:

モジュールへの参照を取得し、__main__モジュールに設定できtest2.pyます。

test.py:

import test2
test2.parent = sys.modules[__name__]

次に、test2.pyで(インポートしないでimportstestを確認してください):testtest2

parent.wa.label.setText('Blablabla')
于 2012-06-10T01:09:34.750 に答える