如何从被调用模块中更新实例变量

时间:2015-01-08 10:10:03

标签: python python-2.7 pyqt instance-variables

我认为我的回答与this answer有关,但不能完全了解它。

我现在意识到我的代码结构不是很好,但目前的设置是:

main_run.py

app = QtGui.QApplication(sys.argv)
app.processEvents()
ui1 = new_main_ui.Ui_Form_Main()
ui1.show()
sys.exit(app.exec_())

new_main_ui

class Ui_Form_Main(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
        ...etc...
这个类中的

是Qlabel对象,它们的文本在UI上按下时会更新。

new_main_ui 中,有一个对另一个模块( sqr_pull.py )的调用。在 sqr_pull.py 的中途我想在我的UI中更新Qlabel,但我无法弄清楚如何在不获取的情况下引用UI实例(ui1):

NameError: name 'ui1' is not defined

我尝试使用sys.modules[__name__]时尝试传递变量,如下所示:

main_run 中的

new_main_ui.parent1 = sys.modules[__name__]

new_main_ui sqr_pull.parent2 = sys.modules[__name__]

中的

然后在 sqr_pull 尝试使用`parent2.QLabel.setText进行更改(" blahblahblah")

但它再次没有识别实例名称。最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

赋予函数访问对象的干净方法是将此对象传递给函数...

# worker.py

def work(ui):
    some_result = do_something()
    ui.update(some_result)
    other_result = do_something_else()

# ui.py

import worker

class Ui(object):
    def some_action(self):
        worker.work(self)        

    def update(self, data):
        self.show_data_somewhere(data)

使用sys.modules或任何内容进行黑客攻击只会导致一些难以维护的混乱。