Python 等待Qt中while循环中的clicked()事件
我如何在for循环中的每次迭代中等待用户按下给定的QPushButtonPython 等待Qt中while循环中的clicked()事件,python,qt,Python,Qt,我如何在for循环中的每次迭代中等待用户按下给定的QPushButton for i in range(10): while (the button has not been pressed): #do nothing #do something 主要问题是我无法在while循环中捕获clicked()事件 编辑: 最后我得到了: for i in range(10): self.hasBeenProcessed =
for i in range(10):
while (the button has not been pressed):
#do nothing
#do something
主要问题是我无法在while循环中捕获clicked()事件
编辑:
最后我得到了:
for i in range(10):
self.hasBeenProcessed = False
# only one function can modify this boolean
# and this function is connected to my button
while (self.hasBeenProcessed is not True):
QtCore.QCoreApplication.processEvents()
因此,对于你是否应该做你所描述的事情,我有点怀疑。另外,我也同意,如果您展示更多的代码来描述上下文,那会更好 说到这里,下面的代码是对您所描述内容的一种尝试。请注意,这绝不是生产就绪代码,而是一个简单的示例来说明这一原理 发生的情况是,我按下
按钮1
调用一个函数,并通过调用QCoreApplication.processEvents()
使事件循环在内部旋转,这意味着GUI仍将接受例如鼠标事件。现在,这是你通常不应该做的事情。但是,在某些情况下可能需要这样做,例如,如果您有一个非模式的QProgressDialog
,并且希望在对话框计数器增加时保持GUI更新(参见示例)
然后,第二部分仅用于在按下按钮2时修改第二个函数中的全局变量,而while
循环将退出
如果有帮助,请告诉我
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
btn2pushed = False
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
i = 0
while ( btn2pushed != True ):
# not doing anything
if ( i % 100000 == 0 ):
print "Waiting for user to push button 2"
QCoreApplication.processEvents()
i += 1;
print "Button 2 has been pushed"
def b2_clicked():
global btn2pushed
btn2pushed = True
if __name__ == '__main__':
window()
因此,对于你是否应该做你所描述的事情,我有点怀疑。另外,我也同意,如果您展示更多的代码来描述上下文,那会更好
说到这里,下面的代码是对您所描述内容的一种尝试。请注意,这绝不是生产就绪代码,而是一个简单的示例来说明这一原理
发生的情况是,我按下按钮1
调用一个函数,并通过调用QCoreApplication.processEvents()
使事件循环在内部旋转,这意味着GUI仍将接受例如鼠标事件。现在,这是你通常不应该做的事情。但是,在某些情况下可能需要这样做,例如,如果您有一个非模式的QProgressDialog
,并且希望在对话框计数器增加时保持GUI更新(参见示例)
然后,第二部分仅用于在按下按钮2时修改第二个函数中的全局变量,而while
循环将退出
如果有帮助,请告诉我
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
btn2pushed = False
def window():
app = QApplication(sys.argv)
win = QDialog()
b1 = QPushButton(win)
b1.setText("Button1")
b1.move(50,20)
b1.clicked.connect(b1_clicked)
b2 = QPushButton(win)
b2.setText("Button2")
b2.move(50,50)
QObject.connect(b2,SIGNAL("clicked()"),b2_clicked)
win.setGeometry(100,100,200,100)
win.setWindowTitle("PyQt")
win.show()
sys.exit(app.exec_())
def b1_clicked():
print "Button 1 clicked"
i = 0
while ( btn2pushed != True ):
# not doing anything
if ( i % 100000 == 0 ):
print "Waiting for user to push button 2"
QCoreApplication.processEvents()
i += 1;
print "Button 2 has been pushed"
def b2_clicked():
global btn2pushed
btn2pushed = True
if __name__ == '__main__':
window()
使用按钮的事件它应该有一个单击的事件,所以实现一个插槽并连接它们。另请参见->以及为什么使用while循环什么也不做?是否您尝试启动多线程应用程序并在while循环中等待事件?因为在收到clicked()事件之前,我不想进入下一个迭代。嗯,我认为您应该重新考虑信号和插槽技术,也许您可以用另一种方式使用它们来解决您的问题?!因为我认为他们真的为你提供了你想要的解决方案…“我怎么能等呢?”你不等待。当用户单击按钮时,通过连接到其单击的
信号,您会得到通知。如果需要在主(GUI)线程的后台运行某些代码,可以通过将代码附加到零超时计时器来实现。使用按钮的事件,它应该有一个单击的事件,因此实现一个插槽并连接它们。另请参见->以及为什么使用while循环什么也不做?是否您尝试启动多线程应用程序并在while循环中等待事件?因为在收到clicked()事件之前,我不想进入下一个迭代。嗯,我认为您应该重新考虑信号和插槽技术,也许您可以用另一种方式使用它们来解决您的问题?!因为我认为他们真的为你提供了你想要的解决方案…“我怎么能等呢?”你不等待。当用户单击按钮时,通过连接到其单击的
信号,您会得到通知。如果您需要在主(GUI)线程的后台运行一些代码,可以通过将代码附加到零超时计时器来实现。在看到答案之前,我在几个小时前通过QCoreApplication.processEvents()解决了这个问题。你的回答证实了这是解决问题的方法!感谢QCoreApplication.processEvents()在看到您的答案之前,我在几个小时前解决了这个问题。你的回答证实了这是解决问题的方法!