ネストされたクラス/スレッドと複数のモジュールを含む大規模なプログラムを作成しました。簡単な 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を更新できる簡単な方法を誰かが知っていれば、例をいただければ幸いです