Я пытаюсь создать игровой автомат, используя tkinter для создания GUI. У меня проблемы с тем, чтобы слоты перестали вращаться. Чтобы заставить слоты вращаться, я использую повторяющийся таймер, который циклически просматривает изображения, и обычный таймер, который останавливает повторяющийся таймер через определенное время. Иногда это работает отлично, но иногда слоты будут вращаться после того, как они будут отменены. В ходе тестирования я обнаружил, что функции остановки всегда работают (что я знаю из операторов печати), но они не всегда останавливают повторяющийся таймер. Всякий раз, когда слоты работают правильно, я не получаю ошибок, но когда они портятся, я получаю ошибку времени выполнения "основной поток не в основном l oop". Есть идеи как это исправить?
from threading import Timer, Thread, Event
class perpetualTimer(): # THe repeating timer
def __init__(self,t,hFunction):
self.t=t
self.hFunction = hFunction
self.thread = Timer(self.t,self.handle_function)
def handle_function(self):
self.hFunction()
self.thread = Timer(self.t,self.handle_function)
self.thread.start()
def start(self):
self.thread.start()
def cancel(self):
self.thread.cancel()
def tmr_rand_img1(): #Functions to cycle images
cycle_img_rand = random.choice([82, 144, 187, 215, 234, 249, 259, 264])
cycle_img = monky_pics.get(rand_pic.get(cycle_img_rand))
slot_1.configure(image = cycle_img)
def tmr_rand_img2():
cycle_img_rand = random.choice([82, 144, 187, 215, 234, 249, 259, 264])
cycle_img = monky_pics.get(rand_pic.get(cycle_img_rand))
slot_2.configure(image = cycle_img)
def tmr_rand_img3():
cycle_img_rand = random.choice([82, 144, 187, 215, 234, 249, 259, 264])
cycle_img = monky_pics.get(rand_pic.get(cycle_img_rand))
slot_3.configure(image = cycle_img)
gen_tmr_3 = perpetualTimer(.05, tmr_rand_img3) #defining thetimers
gen_tmr_2 = perpetualTimer(.05, tmr_rand_img2)
gen_tmr_1 = perpetualTimer(.05, tmr_rand_img1)
def stop_1(): #Functions to stop timers
gen_tmr_1.cancel()
if win != "none":
slot_1.configure(image = current_img)
else:
slot_1.configure(image = rand_img1)
print("timer 1 stopped")
def stop_2():
gen_tmr_2.cancel()
if win != "none":
slot_2.configure(image = current_img)
else:
slot_2.configure(image = rand_img2)
print("timer 2 stopped")
def stop_3():
gen_tmr_3.cancel()
if win != "none":
slot_3.configure(image = current_img)
else:
slot_3.configure(image = rand_img3)
print("timer 3 stopped")
ctl_tmr_1 = Timer(1, stop_1) #Defining and starting timers
ctl_tmr_2 = Timer(1.5, stop_2)
ctl_tmr_3 = Timer(2.5, stop_3)
gen_tmr_1.start()
gen_tmr_2.start()
gen_tmr_3.start()
ctl_tmr_1.start()
ctl_tmr_2.start()
ctl_tmr_3.start()