Python Pyqt4-QProgressBar如何在函数循环处理数据时指示每次

Python Pyqt4-QProgressBar如何在函数循环处理数据时指示每次,python,pyqt4,qprogressbar,Python,Pyqt4,Qprogressbar,它第一次起作用,但在重新调用处理数据的循环函数时不再起作用。我有两个python程序。main显示进度条,第二个循环围绕处理数据。我对stackoverflow和google进行了全面的研究,并努力寻找解决方案。最接近的解决方案是“QProgressBar完成加载2后出现无法解释的延迟”问题,但我无法将其应用于我的问题。我还尝试应用QApplication.processEvents(),但没有成功 主程序。。。等等 def connectDevice(self) if self.usb_s

它第一次起作用,但在重新调用处理数据的循环函数时不再起作用。我有两个python程序。main显示进度条,第二个循环围绕处理数据。我对stackoverflow和google进行了全面的研究,并努力寻找解决方案。最接近的解决方案是“QProgressBar完成加载2后出现无法解释的延迟”问题,但我无法将其应用于我的问题。我还尝试应用QApplication.processEvents(),但没有成功

主程序。。。等等

def connectDevice(self)
  if self.usb_serial != None:
    self.ui.ProgressBar.setMinimum(0)  # settings for showing pyqt4 progress bar            
    self.ui.ProgressBar.setMaximum(0)  # not indicating as expected          
    self.ui.ProgressBar.setValue(0)    # first showing 0%
    self.device = ScopeDev(self.usb_serial)   # device.py my second Python program
    self.device.start()                       # Connect Call... class ScopeDev/def run(self):
    self.device.init_received.connect(self.init_received)     # end of data processing signal received
  else:
    self.Display_MSG("Connection Error", "device not plug into USB port." )

def reprocessdata(self):
  logging.info("Re-Processing Data...")
  self.ui.ProgressBar.setMaximum(0)     # hoping to kick off the progress bar again. Not even showing 0% 
  self.ui.ProgressBar.setValue(0)       # I tried insert QApplication.processEvents() here but did not work
  self.device.init()                    # Call class ScopeDev/def init(self): data was being processed

def init_received(self):
  logging.debug("Init received")
  self.ui.ProgressBar.setMaximum(1)         # indicated 100% on both times, when data processing completed
  self.ui.ProgressBar.setValue(1)           # first from connectDevice and second time from reprocessdata
class ScopeDev (QtCore.QThread):
  init_received = QtCore.pyqtSignal()

def __init__(self, usb_serial, usb_serial_baud=9600, timeout=2):
  QtCore.QThread.__init__(self, None)
  self.serial = serial.Serial(usb_serial, usb_serial_baud, timeout=timeout)   # connect to Arduino
  logging.debug("Connected (%s)" % usb_serial)

def run(self):
  self.init()                    #1 Call...def init(self):

def init(self):
  self.serial.readline().rstrip()            # read println put out by Arduino/plaser.ino
  self.serial.write(b'init')                    
  self.sread(expect=b'^done_init$')

def sread(self, expect=b'^cmd$'):   # loops around to process data from Arduino...etc. when completed...
  self.init_received.emit()       # emits the outbound signal back to the main
  • 我的第二个python程序。。。等等

    def connectDevice(self)
      if self.usb_serial != None:
        self.ui.ProgressBar.setMinimum(0)  # settings for showing pyqt4 progress bar            
        self.ui.ProgressBar.setMaximum(0)  # not indicating as expected          
        self.ui.ProgressBar.setValue(0)    # first showing 0%
        self.device = ScopeDev(self.usb_serial)   # device.py my second Python program
        self.device.start()                       # Connect Call... class ScopeDev/def run(self):
        self.device.init_received.connect(self.init_received)     # end of data processing signal received
      else:
        self.Display_MSG("Connection Error", "device not plug into USB port." )
    
    def reprocessdata(self):
      logging.info("Re-Processing Data...")
      self.ui.ProgressBar.setMaximum(0)     # hoping to kick off the progress bar again. Not even showing 0% 
      self.ui.ProgressBar.setValue(0)       # I tried insert QApplication.processEvents() here but did not work
      self.device.init()                    # Call class ScopeDev/def init(self): data was being processed
    
    def init_received(self):
      logging.debug("Init received")
      self.ui.ProgressBar.setMaximum(1)         # indicated 100% on both times, when data processing completed
      self.ui.ProgressBar.setValue(1)           # first from connectDevice and second time from reprocessdata
    
    class ScopeDev (QtCore.QThread):
      init_received = QtCore.pyqtSignal()
    
    def __init__(self, usb_serial, usb_serial_baud=9600, timeout=2):
      QtCore.QThread.__init__(self, None)
      self.serial = serial.Serial(usb_serial, usb_serial_baud, timeout=timeout)   # connect to Arduino
      logging.debug("Connected (%s)" % usb_serial)
    
    def run(self):
      self.init()                    #1 Call...def init(self):
    
    def init(self):
      self.serial.readline().rstrip()            # read println put out by Arduino/plaser.ino
      self.serial.write(b'init')                    
      self.sread(expect=b'^done_init$')
    
    def sread(self, expect=b'^cmd$'):   # loops around to process data from Arduino...etc. when completed...
      self.init_received.emit()       # emits the outbound signal back to the main
    

  • 以下是一些建议:

    第一个在所有删除第一个初始化中,这三行:

    self.ui.ProgressBar.setMinimum(0)  # settings for showing pyqt4 progress bar            
    self.ui.ProgressBar.setMaximum(0)  # not indicating as expected          
    self.ui.ProgressBar.setValue(0)    # first showing 0%
    
    这是默认情况下完成的

    第二步要做的事情:在
    重新处理数据中
    尝试切换这两行:

      self.ui.ProgressBar.setMaximum(0)        
      self.ui.ProgressBar.setValue(0)
    
    3.使用前两行,尝试用以下命令重置进度条:

    void QProgressBar::reset()[插槽]

    重置进度条。进度条“倒带”并显示“否” 进步

    在您的情况下:
    self.ui.ProgressBar.reset()


    -我不明白的是,为什么要使用进度条?因为您只有两种状态—0(0%)和1(100%)

    ,所以需要一个
    QTimer
    来每隔X秒更新gui一次错误调用
    exec()
    ,然后进入事件循环。而您重新实现的
    run
    缺少这一点,因此您的线程没有事件循环,因此没有信号或插槽。见文章。谢谢JBernardo。我的进度条设置为范围(0,0)。因此,当函数sread()在我的第二个程序中循环时,它将始终指示。我不是在更新酒吧。setvalue(0)。多亏了gatto,它指示介于start()和第一次从第二个程序线程收到的信号之间。但在函数reprocesdata()中使用after时不工作。我必须在第一次跑步后退出最后一步,然后再次开始吗?我在第二个程序中的函数sread()的循环末尾发emmiting,认为线程结束了?我在这里真的有困难,即使在阅读了所有的类引用并试图理解线程之后?我一直在尝试,但没有成功,bar在第一次数据处理运行期间指出,GUI响应良好。但在第二次和后续数据重新处理时,GUI栏被冻结(无响应)