Запустите несколько функций с помощью turtle.screen.onkey () в Python - PullRequest
2 голосов
/ 19 февраля 2020

Для кода:

from turtle import Screen, Turtle, bgcolor

# --- functions ---

def delSec(string):
    if len(string) == 1:
        return "0" + string
    else:
        return string

def tick():
    global milisecs, ticking


    turtle.clear()

    if milisecs < 0:
        turtle.write("TIMER DONE", align='center', font=FONT)
        ticking = False
        return
    else:
        turtle.write(delSec(str(milisecs//(60*60*10)))+":"+delSec(str((milisecs%(60*60*10))//(60*10)))+":"+delSec(str((milisecs%(60*10))//10))+":"+str(milisecs%10), align='center', font=FONT)
##        turtle.write(delSec(str(milisecs//(60*60)))+":"+delSec(str((milisecs%(60*60))//(60)))+":"+delSec(str((milisecs%(60))//1)), align='center', font=FONT)
        if not paused:
              milisecs -= 1

    screen.ontimer(tick, 100)

def reset():
    global milisecs, ticking, key_reset, key_pause, key_both
    #global paused

    print("reset")

    screen.onkey(None, key_reset)  # Disable event handler inside handler
    screen.onkey(None, key_pause)  # Disable event handler inside handler
    screen.onkey(None, key_both)

    milisecs = sum(time*10)

    if not ticking:
        ticking = True
        tick()

    #paused = False

    screen.onkey(reset, key_reset)  # Reenable event handler
    screen.onkey(pause, key_pause)  # Reenable event handler
    screen.onkey(reset, key_both)
    screen.onkey(pause, key_both)

def pause():
    global paused

    print("pause/unpause")

    paused = not paused

# --- main ---

bgcolor('dodgerblue')
FONT = ("Arial", 60, "normal")

strings = input("Please enter the time: ").strip().split(' ')

time = [60 ** (len(strings) - index - 1) * int(unit) for index, unit in enumerate(strings)]

milisecs = -1
ticking = False
paused = False
key_reset = "r"
key_pause = "p"
key_both = "b"

screen = Screen()

turtle = Turtle()
turtle.hideturtle()
turtle.color('white')

reset()

screen.listen()
screen.mainloop()

Я хочу сделать паузу и для сброса таймера, когда я нажимаю клавишу "b". Я попытался сделать это, запустив обе функции сброса и паузы. Однако, как и ожидалось, она перезаписывает первую команду запуска первой функции и запускает вторую функцию только при нажатии b (в данном случае, пауза функции). Я также пробовал строку screen.onkey(pause, reset, key_both), но это вызвало ошибку ,

Может кто-нибудь помочь мне понять, как запустить несколько функций? Я не могу найти ни одного параметра .onkey (), где он не отключает предыдущие функции на основе клавиш. Пожалуйста, помогите!

1 Ответ

1 голос
/ 19 февраля 2020

К сожалению, то, что вы запрашиваете, встроено в функции событий мыши:

onclick(fun, btn=1, add=None)

, где аргумент add используется, чтобы указать, переопределяет ли fun текущую настройку или просто добавляет другую функцию для выполнения в этом случае. Тем не менее, это не было включено в различные onkey*() обработчики событий.

Ниже приводится то, что я считаю обобщенным c способом go по этому поводу:

from turtle import Screen

KEY_RESET = 'r'
KEY_PAUSE = 'p'
KEY_BOTH = 'b'

def reset():
    screen.onkey(None, KEY_RESET)  # Disable event handlers inside handler
    screen.onkey(None, KEY_BOTH)

    print("reset")

    screen.onkey(reset, KEY_RESET)  # Reenable event handlers
    screen.onkey(both, KEY_BOTH)

def pause():
    screen.onkey(None, KEY_PAUSE)  # Disable event handlers inside handler
    screen.onkey(None, KEY_BOTH)

    print("pause")

    screen.onkey(pause, KEY_PAUSE)  # Reenable event handlers
    screen.onkey(both, KEY_BOTH)

def both():
    reset()
    pause()

screen = Screen()

reset()

screen.listen()
screen.mainloop()

так, что я могу запускать несколько функций, когда нажимаю b только одной строкой кода?

Да, есть хак, который мы можем сделать с lambda и tuple, но мы не должны Я так не думаю. «Одна строка кода» не должна быть вашей целью на данный момент.

...