【问题标题】:when and how to use PySide QEventLoop何时以及如何使用 PySide QEventLoop
【发布时间】:2013-06-12 08:02:34
【问题描述】:

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

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 时可能会出错,在这种情况下,我会感谢一些关于更好实施的建议

【问题讨论】:

    标签: python qt pyside qeventloop


    【解决方案1】:

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

    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_())  
    

    【讨论】:

    • 我试过你的例子,它做了我需要它做的事情,但是当它运行时它需要> 90的CPU..你能告诉我为什么或如何解决这个问题吗?
    • 修复了暂停时的 CPU 使用率。
    • 即使在代码的第一部分暂停时它似乎也能正常工作,但是当它显示数字时它实际上会占用所有 CPU
    • 嗯,它不断地执行计算。您如何期望它在没有 CPU 使用的情况下这样做?相反,高 CPU 使用率意味着它可以正常工作。
    • 我没有设置标签,而是将其打印到控制台,处理速度下降到最大约 27%,似乎显示它的调用很昂贵
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多