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)


arrow_upward
0
arrow_downward

Потому что 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