我正在寻找一种解决方案来模拟电子组件的 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()
如果有人对此有任何建议,那将非常受欢迎。