首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时以及如何使用PySide QEventLoop

何时以及如何使用PySide QEventLoop
EN

Stack Overflow用户
提问于 2013-06-16 09:18:01
回答 1查看 3.1K关注 0票数 1

我有一个应用程序,其中我尝试使用while循环,但应用程序就挂起了,现在我认为我需要使用QEventLoop来使应用程序工作这里是一些相关的代码

代码语言:javascript
复制
def ex_initialator(self):
    """ sets up things for the problem runner """

    print "ayadara"
    print "self.start_button_status this is...::" ,self.start_button_status

    #:Pop up dialogs       
    no_options_selected = QtGui.QMessageBox()

    select_range = QtGui.QMessageBox()

    select_op_type = QtGui.QMessageBox()



    #:Shows message if no options selected       
    if len(self.op_types) < 1 and len(self.num_range) < 1 and self.start_button_status == 0:
        print "Please pick from the options provided"
        no_options_selected.exec_()

    #:Shows message if range is not selected
    if len(self.op_types) >= 1 and len(self.num_range) < 1 and self.start_button_status == 0 :
        print "Please pick at least one of the ranges"
        select_range.exec_()

    #:Shows message if op_type/s not selected
    if len(self.op_types) < 1 and len(self.num_range) >= 1 and self.start_button_status == 0:
        print "Please pick at least one of the operation types"        
        select_op_type.exec_()

    #:Correct inputs initiates problem maker
    if len(self.op_types) >= 1 and len(self.num_range) >= 1 and (self.start_button_status == 0 or self.start_button_status == 1):

       self.start_button_status = 1
       self.prob_signal.runner_sig.connect(self.problem_runner)
       self.prob_signal.runner_sig.emit()


    def problem_runner(self):
    """ Expression Makers """
    while self.start_button_status == 1:

        #:picks range types
        range_type = random.choice(self.num_range)

        D = decimal.Decimal

        self.answer_lineEdit.returnPressed.connect(self.ex_evaluator)
        self.answer_lineEdit.clear()

我想要的是能够启动,暂停和停止按钮,我是一个初学者,所以我可能会在使用QLineEdit时出错,在这种情况下,我希望能有一些建议,以便更好地实现

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-16 17:51:35

如果您正在执行长时间的操作,则需要将其移到单独的线程中,或者定期调用QApplication::processEvents()。它允许GUI继续负责。下面是一个简单的例子:

代码语言:javascript
复制
from PySide import QtGui, QtCore
import time

class MyWidget(QtGui.QWidget):
  def __init__(self):
    QtGui.QWidget.__init__(self)
    layout = QtGui.QVBoxLayout(self)
    self.label = QtGui.QLabel()
    self.button_start = QtGui.QPushButton("Start")
    self.button_stop = QtGui.QPushButton("Stop")
    self.button_stop.setEnabled(False)
    self.button_pause = QtGui.QPushButton("Pause")
    self.button_pause.setEnabled(False)
    layout.addWidget(self.label)
    layout.addWidget(self.button_start)
    layout.addWidget(self.button_stop)
    layout.addWidget(self.button_pause)
    self.button_start.clicked.connect(self.processing)
    self.button_pause.clicked.connect(self.pause)
    self.button_stop.clicked.connect(self.stop)

  def processing(self):
    self.button_start.setEnabled(False)
    self.button_stop.setEnabled(True)
    self.button_pause.setEnabled(True)
    self.stop_requested = False
    self.paused = False
    i = 0
    while not self.stop_requested:
      QtGui.QApplication.processEvents()
      if self.paused:
        time.sleep(0.1)
      else:
        i += 1
        self.label.setText(unicode(i))
    self.button_start.setEnabled(True)
    self.button_stop.setEnabled(False)
    self.button_pause.setEnabled(False)

  def pause(self):
    self.paused = not self.paused

  def stop(self):
    self.stop_requested = True

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec_())  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17129362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档