0

我编写了一个包含嵌套类/线程和多个模块的大型程序。我现在想添加一个简单的 GUI 和一些标签来显示一些变量。但是,变量分散在整个模块和类中。我正在寻找一种在不过多更改当前代码的情况下将这些变量更新到 GUI 中的方法。

我对 Pyqt4 有一个基本的了解(我也会接受 tkinter 的答案)。

我尝试不使用信号/发射,因为据我所知,发射必须从 Qthread 发送,这意味着对我的代码进行彻底检查,将类和线程更改为 Qthread。如果可能的话,我想避免这样做。这是我尝试过的一个例子。

测试.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_()) 

此代码有效,但我的变量需要从其他模块/类或线程更新。当我将“类更新”移动到这样的新模块中时:

测试.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 #更新图形用户界面

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,我们将不胜感激

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上(不要导入test,但要确保test导入test2):

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