【问题标题】:How to trigger function dial.valueChanged.connect() only once the left mouse button is released?如何仅在释放鼠标左键后触发功能 dial.valueChanged.connect()?
【发布时间】:2020-07-04 19:54:17
【问题描述】:

背景

我想通过 Python Gui (PyQt) 组件“QDial”控制伺服电机。希望伺服电机应与 GUI 中的拨盘“同时”旋转。

下面是相关代码:

阿杜诺

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.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)?或者有什么其他想法可以解决这个问题?

【问题讨论】:

    标签: python arduino pyqt pyqt5 pyserial


    【解决方案1】:

    如果您想在释放鼠标时调用writeToSerial,那么您必须使用sliderReleased 信号:

    self.dial.sliderReleased.connect(self.writeToSerial)
    

    另一方面,问题在于您没有分隔字符串,以便在解码时知道信息何时结束,例如,如果结束行用作分隔符,那么您可以在方式如下:

    self.ser.write("{}\n".format(self.posAngle).encode())
    
    posOrder = Serial.readStringUntil('\n');
    

    【讨论】:

    • 不错的答案!到第二种方法。它比以前好得多。但我仍然可以在串行监视器中看到一些 posOrder,例如:Set Servo Position to: 4543, Set Servo Position to: 549. 很少出现,但一旦出现会导致伺服电机摆动。
    • @sun0727 也许更复杂的协议会有所帮助,或者更好地验证数据是否有效,例如:if(angle > 0 && angle < 180){ /**/}
    • 非常感谢,是否也可以设置只能逐步滑动的表盘,例如10°,即使我按住鼠标按钮滑动它?
    • @sun0727 可能是的,但这是一个从您的原始问题中逃脱的问题,因此您必须创建另一个帖子
    猜你喜欢
    • 1970-01-01
    • 2014-10-15
    • 2012-12-12
    • 2021-10-17
    • 2019-11-27
    • 2017-09-30
    • 2018-11-26
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多