Python 3 pyQt4使用来自多个模块/类的变量更新GUI

时间:2012-06-10 00:29:33

标签: python python-3.x tkinter pyqt4

我编写了一个包含嵌套类/线程和多个模块的大型程序。 我现在想添加一个简单的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,我们将不胜感激

1 个答案:

答案 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')