如何仅在松开鼠标左键后触发函数 dial.valueChanged.connect()?
How to trigger function dial.valueChanged.connect() only once the left mouse button is released?
背景
我想通过 Python Gui (PyQt) 组件“QDial”控制伺服电机。希望伺服电机应该与 GUI 中的 Dial 一起旋转“同时”。
相关代码如下:
Arduino
void loop(){
// while(!Serial){} //
if(Serial.available()>0){
posOrder = Serial.readString(); // get Angle-Value from Serial
// write to Serial Monitor
Serial.print("Set Servo Position to: ");
Serial.println(posOrder);
int angle = posOrder.toInt();
myservo.write(angle);
Serial.flush();
delay(30);
}
}
QDial
## ....some code...
self.dial.valueChanged.connect(self.writeToSerial)
## ...
def writeToSerial(self):
# create serial connection
self.ser = serial.Serial(self.portPath, timeout=None, baudrate=self.baudRate)
self.posAngle = self.dial.value() # get value
self.ser.write(str(self.posAngle).encode()) # write to Serial
问题
当我点击 Dial 的勾号时,效果很好。点击后,函数dial.valueChanged.connect(self.writeToSerial)
会调用函数writeToSerial()
,有足够的时间将拨号值写入Serial。串行监视器显示:
Set Servo Position to: 65
Set Servo Position to: 30
Set Servo Position to: 170
但是当我通过按住鼠标左键旋转表盘时,函数dial.valueChanged.connect(self.writeToSerial)
将在每个小步中被调用。也就是说,函数writeToSerial()
会被频繁疯狂调用,serial.write()
函数不能及时写入数据。串行监视器显示如下内容:
Set Servo Position to: 65666770717273747677
Set Servo Position to: 99100104108109114116119122126128130131133
Set Servo Position to: 1411421431441451461481501521541561
问题
是否只有松开鼠标左键才能触发功能dial.valueChanged.connect(self.writeToSerial)
?或者有什么办法解决这个问题?
如果你想在鼠标松开时调用writeToSerial
那么你必须使用sliderReleased
信号:
self.dial.sliderReleased.connect(self.writeToSerial)
另一方面,问题在于您没有对字符串进行定界,以便在解码时知道信息何时结束,例如,如果将结束行用作定界符,那么您可以获得数据如下:
self.ser.write("{}\n".format(self.posAngle).encode())
posOrder = Serial.readStringUntil('\n');
背景
我想通过 Python Gui (PyQt) 组件“QDial”控制伺服电机。希望伺服电机应该与 GUI 中的 Dial 一起旋转“同时”。
相关代码如下:
Arduino
void loop(){
// while(!Serial){} //
if(Serial.available()>0){
posOrder = Serial.readString(); // get Angle-Value from Serial
// write to Serial Monitor
Serial.print("Set Servo Position to: ");
Serial.println(posOrder);
int angle = posOrder.toInt();
myservo.write(angle);
Serial.flush();
delay(30);
}
}
QDial
## ....some code...
self.dial.valueChanged.connect(self.writeToSerial)
## ...
def writeToSerial(self):
# create serial connection
self.ser = serial.Serial(self.portPath, timeout=None, baudrate=self.baudRate)
self.posAngle = self.dial.value() # get value
self.ser.write(str(self.posAngle).encode()) # write to Serial
问题
当我点击 Dial 的勾号时,效果很好。点击后,函数dial.valueChanged.connect(self.writeToSerial)
会调用函数writeToSerial()
,有足够的时间将拨号值写入Serial。串行监视器显示:
Set Servo Position to: 65
Set Servo Position to: 30
Set Servo Position to: 170
但是当我通过按住鼠标左键旋转表盘时,函数dial.valueChanged.connect(self.writeToSerial)
将在每个小步中被调用。也就是说,函数writeToSerial()
会被频繁疯狂调用,serial.write()
函数不能及时写入数据。串行监视器显示如下内容:
Set Servo Position to: 65666770717273747677
Set Servo Position to: 99100104108109114116119122126128130131133
Set Servo Position to: 1411421431441451461481501521541561
问题
是否只有松开鼠标左键才能触发功能dial.valueChanged.connect(self.writeToSerial)
?或者有什么办法解决这个问题?
如果你想在鼠标松开时调用writeToSerial
那么你必须使用sliderReleased
信号:
self.dial.sliderReleased.connect(self.writeToSerial)
另一方面,问题在于您没有对字符串进行定界,以便在解码时知道信息何时结束,例如,如果将结束行用作定界符,那么您可以获得数据如下:
self.ser.write("{}\n".format(self.posAngle).encode())
posOrder = Serial.readStringUntil('\n');