Tkinker Unbind, кажется, не отменяет - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть этот код:

def on_click(event=None):
    c.unbind('<Button-1>')
    c.config(background="red")
    print ("You clicked the square")
    time.sleep(delay)
    c.config(background="green")
    c.bind('<Button-1>', on_click)
    root.update()
root = tk.Tk()
c = tk.Canvas(root, width=200, height=200, background="green")
c.pack()
c.bind('<Button-1>', on_click)
root.mainloop()

И когда я щелкаю холст, пока он красный (несвязанный), он печатает «Вы нажали квадрат», когда сон сделан.

Я уже попробовал подход здесь: Удаление и изменение привязки события tkinter но ничего не получилось, потому что я все еще могу щелкнуть по квадрату и получить от него отпечаток, когда он красный

1 Ответ

0 голосов
/ 05 сентября 2018

Вы звоните unbind, затем замораживаете приложение. Пока он заморожен, события продолжают добавляться в очередь без обработки. Сразу после завершения сна вы заново устанавливаете привязку, прежде чем очередь сможет обработать события. Ко времени обработки событий привязка уже будет восстановлена.

Как правило, вы никогда не должны вызывать sleep в программе с графическим интерфейсом, и это одна из хороших иллюстраций почему.

Если вы хотите отменить привязку на короткий период времени, а затем сбросить ее, отмените привязку и затем используйте after для ее сброса по истечении заданного периода времени.

def on_click(event=None):
    c.unbind('<Button-1>')
    c.config(background="red")
    c.after(delay, enable_binding)

def enable_binding():
    c.config(background="green")
    c.bind('<Button-1>', on_click)

Когда вы нажимаете, вызывается ваша функция, вы меняете цвет и отменяете привязку к событию. Затем цикл обработки событий может обработать изменение цвета и обработать дополнительные события . По истечении этого времени ваша функция будет вызвана, и событие будет перепривязано.

...