Возникли проблемы с повторяющимся таймером в python - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь создать игровой автомат, используя 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...