См. Следующую выдержку из effbot документации по after
:
after(delay_ms, callback=None, *args)
Регистрация аварийного обратного вызовакоторый вызывается через определенное время.
Этот метод регистрирует функцию обратного вызова, которая будет вызываться через определенное количество миллисекунд.Tkinter только гарантирует, что обратный вызов не будет вызван раньше, чем это;если система занята, фактическая задержка может быть намного больше.
Вы также можете пропустить обратный вызов.Если вы это сделаете, этот метод просто ожидает указанное количество миллисекунд, не обслуживая какие-либо события (такие же как time.sleep(delay_ms*0.001)
).
delay_ms
Задержка, в миллисекундах.
обратный вызов
обратный вызов.Это может быть любой вызываемый объект.
Когда вы вызываете
root.after(2000, label.grid_forget())
, вы передаете 2000
как задержку в миллисекундах, что хорошо.Вы также передаете label.grid_forget()
в качестве обратного вызова.Однако label.grid_forget()
- это не вызываемый объект, как должно быть, это вызов функции.Следовательно, он будет выполнен, а его возвращаемое значение будет передано в качестве обратного вызова.Поскольку возвращаемое значение .grid_forget()
равно None
, вы на самом деле звоните
root.after(2000, None)
В приведенной выше информации вы можете видеть, что None
является значением по умолчанию для обратного вызова, и когдаВы пропускаете обратный вызов, он просто ожидает указанное количество миллисекунд, не обслуживая никаких событий.Поскольку вы передаете None
в качестве обратного вызова, вы в основном пропускаете обратный вызов, поэтому tkinter зависает.
Вы можете исправить это, передав объект функции (который вызывается) в качестве обратного вызова вместовызов функции:
root.after(2000, label.grid_forget)