我正在用PyQt5编写一个小型GUI,它链接两个系列的值(分别称为a、b、c和alpha、beta)。所有数字都是通过QDoubleSpinBox小部件输入的。你知道吗
这些数字可以通过两个函数相互计算:
alpha, beta = f1(a,b,c)
a,b,c = f2(alpha, beta)
问题是,由于a,b,c的信号触发了一个修改alpha,beta的槽,反之亦然,我一改变某个东西的值就会陷入一个无限循环的内部更新小部件中,直到UI崩溃。当沿着一个或另一个方向对更新进行注释时,一切正常。你知道吗
如果没有GUI布局的细节,我基本上就是这么做的:
from PyQt5.QtWidgets import (QApplication, QWidget, QDoubleSpinBox)
class MainWindow(QWidget):
def __init__(self):
super().__init__()
# initialize UI and widgets (not shown)
self.initUI()
# update alpha beta
self.a.valueChanged.connect(self.update_alphabeta)
self.b.valueChanged.connect(self.update_alphabeta)
self.c.valueChanged.connect(self.update_alphabeta)
# update abc
self.alpha.valueChanged.connect(self.update_abc)
self.beta.valueChanged.connect(self.update_abc)
def update_alphabeta(self):
alpha,beta = f1(self.a, self.b, self.c)
self.alpha.setValue(alpha)
self.beta.setValue(beta)
def update_abc(self):
a,b,c = f2(self.alpha, self.beta)
self.a.setValue(a)
self.b.setValue(b)
self.c.setValue(c)
到目前为止,我还没有找到一个合适的解决办法。也许在我尝试这样做的方式中有一些根本的缺陷。你知道吗
据我所知,如果用户修改了“a”、“b”或“c”,则只应使用f1修改“alpha”和“beta”,更改“alpha”和“beta”,而不更改“a”、“b”和“c”。对于带有f2的“alpha”和“beta”的情况也是如此。如果是这样,那么解决方案是阻止以编程方式更改的元素发出信号,因为这是使用^{} 进行无限递归的原因。你知道吗
相关问题 更多 >
编程相关推荐