Внешний вид кнопки Tkinter не обновляется, пока мышь не покинет область кнопки - PullRequest
0 голосов
/ 05 сентября 2018

Я хочу изменить значение TKinter.Checkbutton при его нажатии.

Кнопка Checkbutton, и я использую IntVar для отслеживания / изменения ее значения.

В следующем примере у меня есть только одна кнопка, и я хочу, чтобы она меняла состояние обратно на 0 всякий раз, когда мы нажимаем на нее (в этом случае это может звучать глупо, но я пытаюсь решить другой более сложный случай, когда меняются другие кнопки значения).

Значение фактически обновляется, но внешний вид кнопки не изменяется, пока мышь не покинет то, что кажется областью кнопки.

Вот минимальный пример:

try :
    import Tkinter as tk
except ImportError as e:
    import tkinter as tk

root = tk.Tk()
val = tk.IntVar(root)
val.trace("w", lambda a, b, c: val.set(0))
button = tk.Checkbutton(root, text="button", variable=val)
button.pack()

root.mainloop()

Воспроизвести:

  • запустить приложение

  • нажмите на кнопку, но не отпускайте ее (кнопка изменит свой внешний вид на выбранный)

  • покинуть область кнопки (кнопка окончательно меняет свой внешний вид на невыбранный)

Почему она ждет, когда мышь покинет свою область? Как заставить мгновенно изменить внешний вид кнопки?

Спасибо

РЕДАКТИРОВАТЬ:

Похоже, что использование ttk.Checkbutton не имеет этой проблемы. Тем не менее, это не объясняет, почему оригинальная кнопка ведет себя так, как она работает, и как вести себя с кнопками tk.

1 Ответ

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

Установка переменной из трассировки записи для одной и той же переменной крайне проблематична - это будет бесконечная рекурсия, если Tcl не отключит автоматически трассировки во время выполнения трассировки. Обновление виджетом отображаемого значения само по себе обрабатывается трассировкой переменной, поэтому неудивительно, что дисплей не синхронизируется - что удивительно, что он снова синхронизируется, я понятия не имею, как это происходит.

Если вы должны сделать это по трассировке записи (а не по опции command=, как было предложено, что происходит, когда переменная находится в более стабильном состоянии), вам нужно немного отложить изменение: root.after(1, var.set, 0) возможно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...