Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 等待Qt中while循环中的clicked()事件_Python_Qt - Fatal编程技术网

Python 等待Qt中while循环中的clicked()事件

Python 等待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循环中的每次迭代中等待用户按下给定的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 = 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()在看到您的答案之前,我在几个小时前解决了这个问题。你的回答证实了这是解决问题的方法!