问题描述
我已经使用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()
当我编译上面的程序时,我会得到这样的输出
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)