2016-10-29 3 views
0

Я обнаружил неожиданную разницу в проверке виджета ввода между классическими и ttk-виджетами в Python 3.5.Разница в проверке виджета виджета между классическими и ttk-виджетами

Использование классических виджетов:

from tkinter import * 

def validate(reason): 
    print("--> validate:", reason) 
    return(True) 

def change(): 
    var.set("data") 

root = Tk() 
vc = root.register(validate) 
var = StringVar() 
Entry(root, textvariable = var, validate = "all", validatecommand = (vc, "%V")).pack() 
Button(root, text = "Change", command = change).pack() 

root.mainloop() 

Использование TTK виджетов:

from tkinter import * 
from tkinter.ttk import * 
... same code as above 

С классических виджетов, при нажатии на кнопку "Изменить", функция Validate называется разумом == «принудительному », который, как представляется, соответствует документу Tk. С виджетами ttk, когда нажата кнопка «Изменить», функция проверки не вызывается. В противном случае функция проверки достоверности, по-видимому, имеет эквивалентное поведение для обоих случаев. У кого-нибудь есть идея, если это ошибка или функция?

ответ

1

Это особенность. Согласно official ttk documentation:

отличия от ОК ЗАПИСИ виджете ВАЛИДАЦИИ

Стандартных Ки записи виджет автоматически отключает проверку (по настройке -Validate никому), если -validatecommand или -invalidcommand изменяет значение входа. В виджетах с тиковой записью Tk отключается только проверка , если один из скриптов проверки вызывает ошибку, или если -validatecommand не возвращает действительное логическое значение. (Таким образом, нет необходимости повторно активировать проверку после изменения значения записи в скрипте проверки).

Кроме того, стандартный виджет ввода активирует проверку всякий раз, когда изменен связанный -textvariable код ; в виджетах с тикрингом Tk нет.