Вопрос

Играя с Python - tkInter - Виджет ввода - когда я использую команду validate (ниже), проверка происходит в первый раз, когда строка > Макс, но когда я продолжаю вводить текст, этапы проверки - после первого раза нет удаления или вставки?Любой совет?(кроме создания настольного приложения через Python)


#!/usr/bin/env python
from Tkinter import *

class MyEntry(Entry):

    def __init__(self, master, maxchars):
        Entry.__init__(self, master, validate = "key",    validatecommand=self.validatecommand)
        self.MAX = maxchars

    def validatecommand(self, *args):
        if len(self.get()) >= self.MAX:
            self.delete(0,3)
            self.insert(0, "no")
        return True

if __name__ == '__main__':
    tkmain = Tk()
    e = MyEntry(tkmain, 5)
    e.grid()
    tkmain.mainloop()
Это было полезно?

Решение

От человека ТК:

Для параметра проверки также будет установлено значение «нет», когда вы редактируете виджет ввода из команды validateCommand или инвалидной команды.Такие выпуски будут иметь приоритет перед проверяемым выпуском.Если вы хотите отредактировать виджет записи (например, установить для него значение {}) во время проверки и при этом у вас по-прежнему установлена ​​опция проверки, вам следует включить команду

после простоя {%W config -validate %v}

не знаю, как это перевести на Python.

Другие советы

Вот пример кода, который ограничит ввод до 5 символов:

import Tkinter as tk

master = tk.Tk()

def callback():
    print e.get()

def val(i):
    print "validating"
    print i

    if int(i) > 4:
        print "False"
        return False
    return True

vcmd = (master.register(val), '%i')

e = tk.Entry(master, validate="key", validatecommand=vcmd)
e.pack()

b = tk.Button(master, text="OK", command=lambda: callback())
b.pack()

tk.mainloop()

Я добавил несколько операторов print, чтобы вы могли увидеть, что они делают в консоли.

Вот другие замены, которые вы можете пройти:

   %d   Type of action: 1 for insert, 0  for  delete,  or  -1  for  focus,
        forced or textvariable validation.

   %i   Index of char string to be inserted/deleted, if any, otherwise -1.

   %P   The value of the entry if the edit is allowed.  If you are config-
        uring  the  entry  widget to have a new textvariable, this will be
        the value of that textvariable.

   %s   The current value of entry prior to editing.

   %S   The text string being inserted/deleted, if any, {} otherwise.

   %v   The type of validation currently set.

   %V   The type of validation that triggered the callback (key,  focusin,
        focusout, forced).

   %W   The name of the entry widget.

Я точно знаю, в чем причина, но у меня есть предчувствие. Проверка правильности выполняется каждый раз, когда запись редактируется. Я провел некоторое тестирование и обнаружил, что оно действительно выполняется и может каждый раз выполнять любые действия во время проверки. То, что заставляет его перестать работать правильно, - это когда вы редактируете его из функции validatecommand. Это вызывает дальнейшее прекращение вызова функции проверки. Я думаю, он больше не распознает дальнейшие изменения значения записи или чего-то еще.

Легальный серб, похоже, имеет скрытую информацию о том, почему это происходит.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top