Я обнаружил две основные проблемы с вашим кодом.Во-первых, это не делает то, что, как вы думаете, следует:
def eventCheck(self, c):
# ...
self.after(2000, self.eventCheck(c))
Поскольку вы передали результат вызова self.eventCheck(c)
в after()
вместо метода self.eventCheck
, это бесконечно.рекурсия, которая происходит немедленно.
Вторая проблема заключается в том, что если вы закомментируете все ваши хронометраж и события, ваш интерфейс на самом деле никогда не появится, поэтому там никогда ничего не будет видно.Я сжал (упростил) ваш пример сценария еще дальше до сценария, который в основном работает:
import tkinter as tk
import threading
import time
class myGUI:
def __init__(self, master, event):
self.master = master
self.event = event
self.label = tk.Label(master, text="")
self.label.pack()
self.canvas = tk.Canvas(master, bg='white', width=80, height=80)
self.canvas.pack()
self.eventCheck()
def redCircle(self):
self.canvas.create_oval(20, 20, 80, 80, width=0, fill='red')
print("redCircle Called")
def greenCircle(self):
self.canvas.create_oval(20, 20, 80, 80, width=0, fill='green')
print("greenCircle Called")
def eventCheck(self):
flag = self.event.is_set()
self.label['text'] = flag
if flag:
self.greenCircle()
else:
self.redCircle()
self.master.after(2000, self.eventCheck)
def timingLoop(event):
while True:
event.set()
time.sleep(2)
event.clear()
time.sleep(2)
def main():
root = tk.Tk()
root.title("myFirst GUI")
event = threading.Event()
t = threading.Thread(target=timingLoop, args=(event,))
t.daemon = True
t.start()
app = myGUI(root, event)
root.mainloop()
if __name__ == "__main__":
main()
Теперь вы сможете добавить обратноваш Frame
суперкласс.Обязательно добавьте фрейм myGUI
к корневому объекту.