我编写了一个包含嵌套类/线程和多个模块的大型程序。 我现在想添加一个简单的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 #updates 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()中的emit函数。这将解决必须将我当前的类/线程更改为Qthreads。
如果有人知道一种简单的方法,我可以通过调用类似update()的类来更新我的GUI,我们将不胜感激
答案 0 :(得分: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 上(不要导入test
,但要确保test
导入test2
):
parent.wa.label.setText('Blablabla')