Pythonic方法避免相互连接的对象中的无限循环

时间:2013-05-02 08:01:35

标签: python pyqt4

假设我有两个QspinBox,如果我更新spinBox_1,第二个将显示两倍的值。如果我更新spinBox_2,第一个将显示该值的一半。使用on_valueChanged1on_valueChanged2这两种方法以及与SIGNAL("valueChanged(int)")的相互联系可以正常工作。 1中的更改​​调用方法更改2,然后更改并再次调用1。幸运的是,事情停在这里,因为因子2和1/2的选择有效,所以第二个值实际上没有改变。如果选择其他值,则会导致几乎无限的呼叫和召回。

解决这个问题的Pythonic方法是什么?在更改之后我会disconnect再次SIGNALconnect,还是有一个解决方案对我来说太明显了?

更新 使用hasFocus()剪切了一个工作示例,如下所示:

QMainWindow.connect(self.ui.doubleSpinBox,SIGNAL("valueChanged(double)"),self.on_change1)
QMainWindow.connect(self.ui.doubleSpinBox_2,SIGNAL("valueChanged(double)"),self.on_change2)

def on_change1(self):
    if self.ui.doubleSpinBox.hasFocus():
        self.ui.doubleSpinBox_2.setValue(3.3*self.ui.doubleSpinBox.value())

def on_change2(self):
    if self.ui.doubleSpinBox_2.hasFocus():
        self.ui.doubleSpinBox.setValue(self.ui.doubleSpinBox_2.value()*.77)

除了它正在发挥作用之外,这是最佳/最通用的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您不能将on_valueChanged拆分为仅检测对象上的手动(而非发信号)更改吗?

这样一来,如果你改变了spinBox_1,它的on_valueChanged1回调会发出spinBox_2信号的变化信号,但不会触发on_valueChanged2,从而避免了无限循环。