Python 3 pyQt4 обновляет графический интерфейс с переменными из нескольких модулей/классов

Я написал большую программу с вложенными классами/потоками и несколькими модулями. Теперь я хотел бы добавить простой графический интерфейс и несколько меток для отображения некоторых переменных. Однако переменные разбросаны по модулям и классам. Я ищу способ обновить эти переменные в графическом интерфейсе без слишком большого изменения текущего кода.

У меня есть элементарное понимание 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, запуская его из любого модуля/класса, где переменная была обновлена, и используя функцию emit внутри Update(). это решило бы необходимость изменить мои текущие классы/потоки на Qthreads.

Если кто-нибудь знает простой способ обновить свой графический интерфейс, просто вызвав такой класс, как update(), пример будет оценен


person Rhys    schedule 10.06.2012    source источник


Ответы (1)


Потому что 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')
person JBernardo    schedule 10.06.2012