Вызов tk.StringVar.set () для текстовой переменной tk.Entry приводит к тому, что validate = «focusout» перестает вызываться

1

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

Поскольку код теперь, когда вы его запускаете, вы можете изменить текст виджета Top Entry один раз. Он будет правильно настроен для Set Text. Затем, если вы попытаетесь снова изменить текст Entry, новый текст будет в виджетах, но обратного вызова не произойдет.

С другой стороны, если вы закомментируете sv.set('Set Text.'), Это поведение полностью исчезнет, и обратный вызов будет вызван столько раз, сколько пожелаете.

Как я могу использовать sv.set(), сохраняя при этом обратный вызов, вызываемый каждый раз, когда виджет Entry теряет фокус?

Теги:
callback
python-3.x
tkinter
tkinter-entry

1 ответ

2
Лучший ответ

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

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

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

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

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

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

  • 0
    Отлично! Как раз то, что мне было нужно. Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню