即使使用串行数据,进度条也不会更新

问题描述

我已经使用pyside对进度条小部件进行了编程。即使从arduino uno接收到串行数据,进度条也必须更新。在arduino程序中,iam以起始值为70发起一个for循环,一旦达到100,它必须运行到100,它应该再次回滚到70。进度条仅显示70%,之后它不会递增。请帮我解决这个问题。

import serial
import time
import sys
from PySide.QtGui import *
from PySide import QtGui,QtCore
from PySide.QtCore import Signal

from time import sleep
list=['COM1','COM2','COM3','COM4','COM5','COM6','COM7','COM8','COM9','COM10','COM11','COM12','COM13','COM14','COM15','COM16','COM17','COM18',]
COM1='COM1'
COM2='COM2'
COM3='COM3'
COM4='COM4'
COM5='COM5'
COM6='COM6'
COM7='COM7'
COM8='COM8'
COM9='COM9'
COM10='COM10'
COM11='COM11'
COM12='COM12'
COM13='COM13'
COM14='COM14'
COM15='COM15'
COM16='COM16'
COM17='COM17'
COM18='COM18'
COM19='COM19'
time.sleep(1)
ser = serial.Serial()
i=1
while True:
    time.sleep(.2)
    print(i)
    ser.port = list[i]
    try:

        ser.open()
        if ser.isOpen()==True:
            print('connected')
            #print('arduino is on COMPORT'.join(i))
            break
        break

    except:
        print('waiting')
        i=i+1
        if i==18:
            print('Kindly remove usb cable and try again')
            break

ser.baudrate = 9600
x = ser.readline()
y = int(x)

#print(y)
 


class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example,self).__init__()
        
        self.initUI()
        
    def initUI(self): 
        self.pbar = QtGui.QProgressBar(self)
        self.pbar.setGeometry(30,40,300,25)
        self.pbar.setAlignment(QtCore.Qt.AlignCenter) 
        self.pbar.setMinimum(0)
        self.pbar.setValue(y)
        #self.pbar.setValue(40)

        #self.pbar.setRange(90,100)
        self.pbar.setStyleSheet("QProgressBar::chunk"
                         "{"
                         "background-color: Yellow;"
                         "margin: 4px;"
                         "}")

     #   self.timer = QtCore.QBasicTimer()
     #   self.step = y



        self.setGeometry(300,480,170)
        self.setWindowTitle('QtGui.QProgressBar')
        #self.show()
        self.myLongTask = TaskThread()
        self.on_start
        self.myLongTask.notifyProgress.connect(self.on_progress)

    
    def on_start(self):
        self.myLongTask.start()

    def on_progress(self,y):
        self.bar.setValue(y)


class TaskThread(QtCore.QThread):
   #notifyProgress = QtCore.pyqtSignal(int)
   notifyProgress = Signal(int)

   def run(self):
        while True:
            x = ser.readline()
            y = int(x)
            for y in range(100):
                self.notifyProgress.emit(y)
       #    sleep(0.1)
            
def main():
    
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    ex.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

当我编译上面的程序时,我会得到这样的输出

Progress bar showing 70% progress

Arduino Uno程序

void setup() {
  // put your setup code here,to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here,to run repeatedly:
  //Serial.println("hello");
  for (int i = 70; i <= 100; i++) {
  Serial.println(i);
  delay(1000);
}
}

解决方法

TaskThread类

class TaskThread(QtCore.QThread):
   notifyProgress = Signal(int)

   def run(self):
       while True:
           x = ser.readline()
           y = int(x)
           # you are already sending an actual progress value
           self.notifyProgress.emit(y)

和示例类

class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example,self).__init__()
        
        self.initUI()
        
    def initUI(self): 
        self.pbar = QtGui.QProgressBar(self)
        self.pbar.setGeometry(30,40,300,25)
        self.pbar.setAlignment(QtCore.Qt.AlignCenter) 
        self.pbar.setMinimum(0)
        self.pbar.setValue(y)
        #self.pbar.setValue(40)

        #self.pbar.setRange(90,100)
        self.pbar.setStyleSheet("QProgressBar::chunk"
                         "{"
                         "background-color: Yellow;"
                         "margin: 4px;"
                         "}")

        self.setGeometry(300,480,170)
        self.setWindowTitle('QtGui.QProgressBar')
        #self.show()
        self.myLongTask = TaskThread()
        # connect signal before thread is started
        self.myLongTask.notifyProgress.connect(self.on_progress)
        # start thread
        self.on_start()
    
    def on_start(self):
        self.myLongTask.start()

    def on_progress(self,y):
        self.bar.setValue(y)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...