【问题标题】:Update status bar in main window from another script pyqt从另一个脚本pyqt更新主窗口中的状态栏
【发布时间】:2014-02-05 11:40:21
【问题描述】:

我正在创建一个 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

我不明白为什么这行不通,但绝对不行!任何解决方法的想法?

谢谢,

皮特

【问题讨论】:

  • 如何调用其他“文件”中的函数?
  • TopWindow.updateStatus(PercentComplete)

标签: python user-interface pyqt


【解决方案1】:

我相信你误解了scope of a variable。让我解释一下。

当你编写以下代码时,

def myfunction():
    a = 5
    print(a) # OK

b = a # This line fails

你会失败,因为alocalmyfunction,也就是说它只存在于那个函数内部,并且最后一条语句引用了一个未知的变量到蟒蛇。模块也是如此。一个模块中定义的变量不能被其他模块访问... 除非你真的想做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 不太喜欢一个线程尝试修改另一个线程的成员(即您的主窗口)。您应该使用信号将信息从一个线程传递到另一个线程。

【讨论】:

  • 正确,我想因为我全局实例化了主窗口,它可以在子函数中使用,但你的建议有效,谢谢!现在只需要多线程它,因为它在执行期间冻结。
  • 你能指出一个使用线程间信号的例子的方向吗?我真的很难让它发挥作用。
  • 我有一些示例应用程序,但它们对于演示来说相当复杂,所以我从头开始给你写了一个:gist.github.com/Cilyan/8831684 作为一个 Qt 程序员,我还远远没有了解一切,所以可能有一些可以改进的地方...
  • 我还没有资格为您提供贵金属来解决您的麻烦,但如果可以的话,我会的!非常感谢,我相信这对其他人也有用,尤其是对于 cmets。你用的是什么版本的python?
  • 没问题。我通常使用 Python 3.3,这个例子是用 3.2 完成的,因为我在这台 PC 上只为那个版本安装了 PyQt。 Python 2.x 应该可以正常工作,如果不是,您可能需要将 super 替换为父类和对 self 的引用,例如QtGui.QApplication.__init__(self, sys.argv) 而不是 super().__init__(sys.argv)
【解决方案2】:

您可以执行以下操作:

MainWindow类中,首先要创建一个状态栏:self.statusbar = self.statusBar()

然后,从分析代码中,传递对 MainWindow 对象的引用,然后您可以使用此方法根据需要更新 statusbar

main_window_object.statusbar.showMessage(PercentComplete)

编辑:我不知道LastData 是什么,但理想情况下您需要从 QtGui.QMainWindow 继承。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多