我正在寻找一种解决方案,以模拟电子组件的UI行为和带有LED的用户交互(应该是按钮),以报告电子组件的内部状态。
我正在使用python和tKinter模块来执行此操作。
我的代码运行,并且我的GUI窗口正确显示。但是,当我按几次按钮时,行为不符合预期。
每个LED有4种可能的状态(关闭,打开,(闪烁)慢速,(闪烁)快速)。我有4个可以影响状态的按钮。每个按钮都有一个在我定义的小部件类中定义的交互功能,并且一旦调用此功能,每个按钮都会重新定义小部件的内部状态。
为了控制LED的闪烁,我使用了一个单循环和self.after(..)函数。该功能如下:
def toggleLeds(self):
for led in [self.ledTxIP, self.ledRxIP, self.ledTxRS, self.ledRxRS, self.ledPower, self.ledRun, self.ledStatus, self.ledConfig]:
if (((led[1] == "SLOW") and (self._FastBlinking == 0)) or (led[1] =="FAST")):
bg = led[0].cget("background")
bg = "green" if bg == "black" else "black"
led[0].configure(background=bg)
elif((led[1] == "OFF") and (self._update == 1)):
led[0].configure(background="black")
self._update = 0
elif (self._update == 1):
led[0].configure(background="green")
self._update = 0
self._FastBlinking = (self._FastBlinking + 1)%2
self.update_idletasks()
self.after(self._FastBlinkTime, self.toggleLeds)
通过self.after函数递归调用此函数,在交互函数的末尾,我为每个按钮定义了该函数。
这是我定义单个LED的方式:
self.ledTxIP = [tk.Label(self, width=1, borderwidth=2, relief="groove"),"OFF"]
以下是按钮交互功能的示例:
def pushMode(self):
if (re.search("Reset",self.state) == None):
if (self.clickModCnt == 0):
self.state = "Status"
self._stateTimer = int(time.gmtime()[5])
elif (self.clickModCnt == 1):
if(int(time.gmtime()[5]) - self._stateTimer < 3):
self.state = "Config"
else:
self.state = "RunMode"
else:
self.state = "RunMode"
self.clickModCnt = (self.clickModCnt + 1)%3
self._update = 1
self.updateLedState()
如果有人对此有任何建议,那就太受欢迎了。
四季花海
相关分类