我遇到了一个问题,在这里我想使用GUI从python程序运行几个命令行功能。我不知道我的问题是否特定于 PyQt4,
或者是否与我对Python代码的错误使用有关。
我希望做的是在GUI上有一个标签,以更改其文本值以通知用户正在执行哪个命令。但是,当我使用 for
循环运行多个命令时,就会出现我的问题。我希望标签在每个循环中进行更新,但是,该程序不是在每个循环中更新GUI标签,而是仅在 整个 for
循环完成后才更新自身,并仅显示最后执行的命令。
我在我的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_())
可以正确更新标签, 但是在循环结束之前不会重绘GUI。
您可以采取以下措施:
将长时间运行的循环移至辅助线程,以在主线程中绘制GUI。
调用app.processEvents()
您的循环。这使Qt有机会处理事件并重新绘制GUI。
中断循环,并使用超时为0的 QTimer 使其运行。
使用线程是最好的选择,但是与调用 processEvents 相比,它涉及的工作要多得多。用计时器来做是一种老式的方法,不再被推荐。(请参阅文档)
FOREACH标签 foreach标签的用法和PHP语法非常接近,用于循环输出数组或者对象的属性,用法如下: $list = User::all(); $this->assign('list',$list); 模板文件中可以这样输出 {foreach $list as $key=>$vo } {$vo.id}:{$vo.name} {/foreach} 可以不通过模板变量赋值,支持使用函
下面AtomicBigInteger实现的方法是原子操作吗?我特别想知道部分。JVM是否以某种方式保证for循环中的每个循环都是原子式执行的? 我从这里得到了这段代码:是否可以以线程安全的方式安全地递增BigInteger,也许可以使用AtomicReference,W/O锁定?然而,这个实现正在进行中,您可以在Internet上的许多不同地方找到它。
我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两
我想要一个循环,检查当前的月,12个月在未来和4个月在过去。
本文向大家介绍C#中for循环、while循环循环执行的方法,包括了C#中for循环、while循环循环执行的方法的使用技巧和注意事项,需要的朋友参考一下 先给大家介绍下C#中的循环执行for循环 在这一节练习中,我们向大家介绍一下C#中的另一种重要的循环语句,for循环。 表达式1:一般为赋值表达式,给控制变量赋初值; 表达式2:逻辑表达式,循环控制条件;当条件为真时,循环执行循环体中的语句。
我需要在每个循环中生成唯一的id,而不是"城市选择" 我如何在这里生成它? 我需要一些像这样的ID: 输出: