Вставка значения по умолчанию в tkinter Entry останавливает проверку - PullRequest
2 голосов
/ 01 апреля 2012

Я проверял поля ввода с здесь . Приведенный ниже код взят из ответа с дополнительным условием: если введенное значение равно 'Q', программа добавляет 'test' к началу значения Entry.

Однако, как только это значение вставлено, кажется, что вся проверка выходит за пределы окна, и Entry допускает значения в верхнем регистре. Некоторые тесты на моей программе показывают, что команда проверки (OnValidate в данном случае) не вызывается при дальнейших событиях Entry (ключ, focusin / out и т. Д.).

import Tkinter as tk
class MyApp():
    def __init__(self):
        self.root = tk.Tk()
        vcmd = (self.root.register(self.OnValidate), 
                '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
        self.entry = tk.Entry(self.root, validate="key", 
                              validatecommand=vcmd)
        self.entry.pack()
        self.root.mainloop()

    def OnValidate(self, d, i, P, s, S, v, V, W):
        if S == "Q":
            self.entry.insert(0,"test")
        # only allow if the string is lowercase
        return (S.lower() == S)

app=MyApp()

Причина, по которой я это делаю, заключается в том, что я хочу, чтобы запись отображала значение по умолчанию, если его значение остается пустым после любых изменений, внесенных пользователем. (т.е. мое состояние будет if not P на фокусе)

Любые идеи о том, как реализовать это или что-то пошло не так, приветствуются.

Ответы [ 2 ]

4 голосов
/ 01 апреля 2012

Опция validatecommand предназначена только для проверки, а не для выполнения других действий. Поведение, которое вы видите, является задокументированным поведением.

Согласно официальной документации о подтверждении заявки :

... Параметр validate также будет иметь значение none при редактировании виджета ввода изнутри validateCommand или invalidCommand.

(примечание: tkinter - это нечто большее, чем обертка для реализации tcl в tcl. По этой причине документацию tcl / tk можно использовать в качестве окончательного руководства по поведению Tkinter)

2 голосов
/ 01 апреля 2012

Я собираюсь ответить полностью, основываясь на:

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

и надеемся, что этот пример указывает на то, что вы хотите:

import Tkinter as tk

def analyze(event=None):
    content = entry_contents.get()
    if content == "":
        entry_contents.set("default")

lord = tk.Tk()

entry_contents = tk.StringVar()
aEntry = tk.Entry(lord, textvariable=entry_contents)
aEntry.grid()

aText = tk.Text(lord, font=("Georgia", "12"))
aText.grid()

aEntry.bind("<FocusOut>", analyze)

lord.mainloop()

или, если управляющая переменная не будет вам полезна:

import Tkinter as tk

def analyze(event=None):
    content = aEntry.get()
    if content == "":
        aEntry.insert(0, "default")

lord = tk.Tk()

aEntry = tk.Entry(lord)
aEntry.grid()

aText = tk.Text(lord, font=("Arial", "12", "bold"))
aText.grid()

aEntry.bind("<FocusOut>", analyze)

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