Вопрос в названии, по сути: как мне получить обратный вызов validatecommand
, чтобы он продолжал вызываться после установки textvariable
в Entry?Вот минимальный рабочий пример (MWE):
import tkinter as tk
root = tk.Tk()
sv = tk.StringVar()
def callback():
print(sv.get())
sv.set('Set Text.')
return True
e = tk.Entry(root, textvariable=sv, validate="focusout",
validatecommand=callback)
e.grid()
e = tk.Entry(root)
e.grid()
root.mainloop()
Обратите внимание, что существует второй виджет tk.Entry
, позволяющий первому потерять фокус, то есть событие, которое мы пытаемся захватить.
Поскольку код теперь такой, когда вы его запускаете, вы можете изменить текст верхнего виджета Entry один раз.Он будет правильно установлен на Set Text.
Затем, если вы попытаетесь изменить текст Записи снова, новый текст будет в виджете, но обратный вызов не произойдет.
С другой стороны,если вы закомментируете код sv.set('Set Text.')
, это поведение полностью исчезнет, и обратный вызов будет вызываться столько раз, сколько вы захотите.
Как я могу иметь функциональность sv.set()
, сохраняя при этомобратный вызов вызывается каждый раз, когда виджет ввода теряет фокус?