電子コンポーネントの UI の動作と、電子コンポーネントの内部状態を報告する LED とのユーザー インタラクション (ボタンを押す必要があります) をエミュレートするソリューションを探しています。
そのために python と tKinter モジュールを使用しています。
コードが実行され、GUI ウィンドウが正しく表示されます。ただし、ボタンを数回押すと、動作が期待どおりになりません。
各 LED には 4 つの可能な状態 (オフ、オン、(点滅) 遅い、(点滅) 速い) があります。状態に影響を与えることができる4つのボタンがあります。各ボタンには、私が定義したウィジェット クラスで定義された相互作用関数があり、この各関数が呼び出されると、ウィジェットの内部状態が再定義されます。
LED の点滅を制御するために、1 つのループと 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()
誰かがこれについてアドバイスを持っているなら、それは大歓迎です.