Вызов tk.StringVar.set () для текстовой переменной tk.Entry приводит к тому, что validate = "focusout" перестает вызываться - PullRequest
0 голосов
/ 29 сентября 2018

Вопрос в названии, по сути: как мне получить обратный вызов 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(), сохраняя при этомобратный вызов вызывается каждый раз, когда виджет ввода теряет фокус?

1 Ответ

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

Это обсуждается на странице руководства Tk для entry:

Параметр validate также будет установлен на none при редактировании виджета вводаизнутри либо validateCommand, либо invalidCommand.Такие выпуски переопределяют ту, которая была проверена.

Предположительно, это сделано, чтобы избежать бесконечной рекурсии.

Вы можете запустить это (вместо данного кода Tcl, after idle {%W config -validate %v})

root.after_idle(lambda: e.config(validate="focusout"))

из обратного вызова, чтобы запланировать реконфигурацию виджета, чтобы снова включить проверку (после изменения ваших источников таким образом, чтобы e был правильным Entry виджетом, т.е. не вторым).

...