Python tkInter Вступление весело - PullRequest
2 голосов
/ 19 июня 2009

Игра с Python - виджет tkInter - Entry - когда я использую команду validate (ниже), проверка происходит в первый раз, когда строка> Max, но когда я продолжаю вводить текст, шаги проверки - после удаления первый раз? Любой совет? (вне того, чтобы не создавать настольное приложение через 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()

Ответы [ 3 ]

3 голосов
/ 20 июня 2009

От Tk man :

Параметр validate также будет иметь значение none, когда вы редактируете виджет ввода изнутри validateCommand или invalidCommand. Такие издания будут иметь приоритет над тем, что было проверено. Если вы хотите отредактировать виджет ввода (например, установите его на {}) во время проверки и при этом у вас все еще установлена ​​опция проверки, вы должны включить команду

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

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

2 голосов
/ 07 декабря 2010

Вот пример кода, который ограничит ввод до 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()

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

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

   %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.
1 голос
/ 20 июня 2009

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

У легального сербца, похоже, есть закулисная информация о том, почему это происходит.

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