【问题标题】:How to run one function only after another, at pushbutton using PYQT如何在使用 PYQT 的按钮处仅运行一个功能
【发布时间】:2021-12-28 08:44:50
【问题描述】:

我已经阅读了多篇关于此的帖子,但无法修复我的代码。

我正在运行一个 GUI(使用 PyQt5),它从另一个脚本 (file_py) 运行一个函数 (Extraction())。我想做的是在启动时显示绿色 LED 图片 (.png) 的脚本,然后在单击按钮时,在运行 Extraction() 之前,GUI 将显示红色 LED 图片。

from PyQt5 import QtCore, QtGui, QtWidgets
import file_py as my_script

def setupUi(self, MainWindow):

        self.pushButton.clicked.connect(self.trigger_status_icon)
        
        self.LED_Green = QtGui.QPixmap("C:/Desktop/green-led-on.png")
        self.LED_Red = QtGui.QPixmap("C:/Desktop/red-led-on.png")
        self.labelStatus = QtWidgets.QLabel()
        self.labelStatus.setPixmap(self.LED_Green) #starting GUI with a Green Led picture
        self.labelStatus.setScaledContents(True)


    def trigger_status_icon(self):
        self.labelStatus.setPixmap(self.LED_Red)
        return self.run_Script()

    def run_Script(self):
        my_script.Extraction()

但是我使用这段代码得到的结果如下:在 GUI 开始时,会显示一个绿色 LED 图片。单击按钮后,函数Extraction() 运行,只有在它完成后才会出现Led Red 图片。

我该怎么做才能在函数Extraction()之前运行Led Red图片?

【问题讨论】:

    标签: python pyqt


    【解决方案1】:

    在分配图片后添加QtWidgets.QApplication.processEvents()会刷新QtWidget。

    def trigger_status_icon(self):
        self.labelStatus.setPixmap(self.LED_Red)
        QtWidgets.QApplication.processEvents()
        return self.run_Script()
    

    【讨论】:

    • 这是正确答案。请注意——processEvents() 可能需要在run_Script 方法内部定期调用,以防止 UI 冻结。
    【解决方案2】:

    当您在 UI 发生变化后进行一些“冗长”操作时,您可以使用 QWidget.update 方法显式刷新 UI:

    def trigger_status_icon(self):
            self.labelStatus.setPixmap(self.LED_Red)
            self.update()
            return self.run_Script()
    

    【讨论】:

    • 如果我添加 self.update() 我会收到错误消息:“'Ui_MainWindow' 对象没有属性 'update'”。如果显式调用 Widget self.labelStatus.update() 我继续我的问题,即它只在运行脚本后更改图片
    • 是的,这是一个错误的答案。正确的答案是让应用程序处理事件,正如@eduardo2111 所述
    • @eduardo2111 如果您收到该错误,那是因为您使用的是经过编辑的 pyuic 文件。退出这些文件总是不鼓励并且被认为是不好的做法,原因有很多,包括没有经验的用户以错误的方式使用它们,期望他们的类表现得像 QWidget 而他们不是(这正是你的情况)。
    • @musicamante 为什么编辑 pyuic 是不好的做法?我认为这是获得更好的书面 GUI 的捷径。
    • @eduardo2111 有很多原因,例如:每当您需要对 UI 进行一些更改时,合并更改是一团糟,通常会导致代码被遗忘或放错位置;复杂的 UI 使整个代码变得非常扩展,将逻辑与 ui 分离无论如何是一个更好的选择,因为它使代码更清晰;表单类 (Ui_MainWindow) 是一个基本的 python 对象,因此您不能覆盖实际小部件的功能,并且无论如何您都需要对基本小部件进行子类化;由于表单类不是 QWidget,它不能用作Qt parent
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多