我正在创建一个GUI,使用PyQt在Python中运行疲劳分析程序。当用户在主窗口中单击“开始”以开始分析时,将调用另一个文件中的函数,然后该函数会突然消失(可能持续数小时)直到完成。
我想找到一种方法来从单独的疲劳分析文件中更新主窗口中的状态栏。我不在乎如何实现这一点,但我真的不只是将疲劳分析文件中的所有内容复制并粘贴到GUI文件中(在这种情况下,我知道如何更新状态栏)。
到目前为止,我已尝试使用下面的全局代码启动GUI(MainWindow是一个包含所有设置GUI的东西的类,而updateStatus是该类中用于更新GUI状态栏的方法):
app = QtGui.QApplication(sys.argv)
TopWindow = MainWindow(LastData)
TopWindow.show()
sys.exit(app.exec_())
在疲劳分析文件中,我有以下代码,在循环中调用:
TopWindow.updateStatus(PercentComplete)
这会引发以下错误:
NameError: global name 'TopWindow' is not defined
我不明白为什么这不起作用,但绝对不行!任何解决方法的想法?
谢谢,
皮特
答案 0 :(得分:3)
我相信你误解了scope of a variable。让我解释一下。
编写以下代码时,
def myfunction():
a = 5
print(a) # OK
b = a # This line fails
你会失败,因为a
本地到myfunction
,也就是说它只存在于该函数中,最后一个语句引用变量python不知道。模块也是如此。其他模块无法访问一个模块中定义的变量... 除非您确实想要crappy things。
一个很好的解决方案是将您的模块视为主要模块,从其他模块中调用功能。这些功能可以是类或函数,换句话说,您将引用作为参数传递给主窗口。
Main module
import fatigue_analysis
class MainWindow(QtGui.Window):
# ....
def start_file_compute(self, path_to_file):
# Pass a reference to self (MainWindow instance) to the helper function
fatigue_analysis.start(path_to_file, self)
# ....
fatigue_analysis.py
def start(path_to_file, top_window):
# ....
top_window.updateStatus(PercentComplete)
# ....
也就是说,您可以考虑使用QtCore.QThread运行长计算,同时保持GUI响应。 在这种情况下,请注意Qt不太喜欢一个线程试图修改另一个线程的成员(即你的主窗口)。您应该使用信号将信息从线程传递到另一个线程。
答案 1 :(得分:1)
您可以执行以下操作:
在MainWindow
课程中,您应首先创建状态栏:self.statusbar = self.statusBar()
然后,从分析代码中,将引用传递给MainWindow
对象,然后您可以根据需要更新statusbar
:
main_window_object.statusbar.showMessage(PercentComplete)
编辑:我不知道LastData
是什么,但你需要理想地从QtGui.QMainWindow继承。