PyQt4 GUI中的标签不会随着每个FOR循环循环而更新

时间:2010-03-20 08:45:14

标签: python for-loop label pyqt4

我遇到了问题,我希望使用GUI从python程序运行几个命令行函数。我不知道我的问题是否特定于 PyQt4 ,或者是否与我对python代码的错误使用有关。

我想要做的是在我的GUI上有一个标签更改其文本值,以通知用户正在执行哪个命令。然而,当我使用 for 循环运行多个命令时,会出现我的问题。我希望标签能够在每个循环中更新自己,但是,程序不会在每个循环中更新GUI标签,相反,它只会在整个 后自动更新循环完成,并仅显示最后执行的命令。

我在我的GUI环境中使用PyQt4。我已经确定标签的文本变量确实正在用每个循环进行更新,但实际上并没有在GUI中直观地显示。

我有办法强制标签自行更新吗?我在循环中尝试了 update() repaint()方法,但它们没有任何区别。

我真的很感激任何帮助。 谢谢。

罗尼。

以下是我正在使用的代码:

# -*- coding: utf-8 -*-
import sys, os
from PyQt4 import QtGui, QtCore
Gui = QtGui
Core = QtCore

# ================================================== CREATE WINDOW OBJECT CLASS
class Win(Gui.QWidget):
    def __init__(self, parent = None):
        Gui.QWidget.__init__(self, parent)

        # --------------------------------------------------- SETUP PLAY BUTTON
        self.but1 = Gui.QPushButton("Run Commands",self)
        self.but1.setGeometry(10,10, 200, 100)

        # -------------------------------------------------------- SETUP LABELS
        self.label1 = Gui.QLabel("No Commands running", self)
        self.label1.move(10, 120)

        # ------------------------------------------------------- SETUP ACTIONS
        self.connect(self.but1, Core.SIGNAL("clicked()"), runCommands)


# =======================================================  RUN COMMAND FUNCTION
def runCommands():
    for i in commands:
        win.label1.setText(i)       # Make label display the command being run
        print win.label1.text()     # This shows that the value is actually
                                    # changing with every loop, but its just not
                                    # being reflected in the GUI label
        os.system(i)

# ======================================================================== MAIN

# ------------------------------------------------------  THE TERMINAL COMMANDS
com1 = "espeak 'senntence 1'"
com2 = "espeak 'senntence 2'"
com3 = "espeak 'senntence 3'"
com4 = "espeak 'senntence 4'"
com5 = "espeak 'senntence 5'"
commands = (com1, com2, com3, com4, com5)

# --------------------------------------------------- SETUP THE GUI ENVIRONMENT
app = Gui.QApplication(sys.argv)
win = Win()
win.show()

sys.exit(app.exec_())

3 个答案:

答案 0 :(得分:13)

标签可以正确更新,但是在循环结束之前不会重新绘制GUI。

以下是您可以采取的措施:

  • 将长时间运行的循环移动到辅助线程,绘制GUI正在主线程中进行。

  • 在循环中调用app.processEvents()。这使Qt有机会处理事件并重绘GUI。

  • 分解你的循环,让它使用QTimer运行,超时为0。

使用线程是最好的选择,但涉及的工作比调用 processEvents 要多得多。用计时器做它是老式的方式,不再推荐了。 (见文件)

答案 1 :(得分:2)

您对此GUI的工作原理存在基本的误解。 Qt GUI必须在自己的事件循环中运行。您的循环运行,而GUI无法在循环执行之间完成工作。也就是说,当您的for循环正在运行时,GUI代码不会获得CPU时间,也不会更新。

您可以使用事件设置计时器,并在此事件的处理程序中执行您的代码一段时间 - 这将解决您的问题。

答案 2 :(得分:0)

或者您只需调用repaint()即可立即更新GUI。