Ошибка проверки входа с tkinter

В настоящее время я изучаю основы tkinter и создаю небольшую суперпростую программу, чтобы проверить свои знания о некоторых из самых простых виджетов.

У меня проблема с проверкой и записью, возможно, из-за моего непонимания в этом вопросе ... Это вызывает три вопроса:

1 - Как сделать то, что было сделано здесь: https://stackoverflow.com/a/4140988/2828287 без класса часть. Просто делаю это, когда запускается скрипт.

2 - Что все это за себя. и сам там делаешь? Какие из них есть, потому что это класс, а какие есть из-за самого метода проверки?

3 - Что не так в моем коде? на основе этого объяснения >> http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html

from tkinter import *
from tkinter import ttk

# function that should take the '%d' replacer and only validate if the user didn't delete
def isOkay(self, why):
    if why == 0:
        return False
    else:
        return True

okay = entry.register(isOkay) # didn't understand why I had to do this, but did it anyway...
entry = ttk.Entry(mainframe, validate="key", validatecommand=(okay, '%d'))
# the mainframe above is a ttk.Frame that contains all the widgets, and is the only child of the usual root [ = Tk()]
entry.grid(column=1,row=10) # already have lots of stuff on upper rows

Ошибка, которую я получаю, выглядит следующим образом: «NameError: имя 'entry' не определено» Я пытался изменить порядок вещей, но всегда есть одна из этих ошибок. Она указывает на строку, в которой я выполняю .register () материал

--EDITED CODE-- Это не вызывает у меня ошибки, но все же позволяет удалить ...

def isOkay(why):
    if (why == 0):
        return False
    else:
        return True

okay = (**root**.register(isOkay), "%d")
entry = ttk.Entry(mainframe, validate="key", validatecommand=okay)
entry.grid(column=1,row=10)

(где «корневая» часть написана между ** **, это должен быть корень? Или это может быть любой родительский элемент виджета, который будет его использовать? Или это должен быть непосредственный родительский элемент для него? например, у меня есть: root >> mainframe >> entry. Должен ли он быть root, mainframe или может быть и тем, и другим?)


person RGS    schedule 04.01.2014    source источник


Ответы (1)


Все случаи использования self связаны с использованием классов. Они не имеют абсолютно никакого отношения к валидации. Вообще ничего.

Вот пример без использования классов и без длинного комментария, описывающего функцию проверки:

import Tkinter as tk

def OnValidate(d, i, P, s, S, v, V, W):
    print "OnValidate:"
    print "d='%s'" % d
    print "i='%s'" % i
    print "P='%s'" % P
    print "s='%s'" % s
    print "S='%s'" % S
    print "v='%s'" % v
    print "V='%s'" % V
    print "W='%s'" % W
    # only allow if the string is lowercase
    return (S.lower() == S)

root = tk.Tk()

vcmd = (root.register(OnValidate), 
        '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
entry = tk.Entry(root, validate="key", 
                      validatecommand=vcmd)
entry.pack()
root.mainloop()

Примечание: цель регистрации команды - создать мост между базовым движком tcl / tk и библиотекой python. По сути, он создает команду tcl, которая вызывает функцию OnValidate, передавая ей предоставленные аргументы. Это необходимо, потому что tkinter не смог предоставить подходящий интерфейс для функций проверки ввода tk. Вам не нужно делать этот шаг, если вам не нужны все причудливые переменные (%d, %i и т. Д.).

Ошибка NameError: name 'entry' is not defined возникает из-за того, что вы используете entry до того, как определите, что такое entry. Одно из преимуществ использования классов заключается в том, что они позволяют определять методы дальше в файле, чем там, где вы их используете. Используя процедурный стиль, вы вынуждены определять функции до их использования *.

* технически говоря, вы всегда должны определять функции перед их использованием. В случае использования классов вы фактически не используете методы класса до тех пор, пока не создадите экземпляр класса. Экземпляр фактически не создается до самого конца файла, что позволяет определить код задолго до его использования.

person Bryan Oakley    schedule 04.01.2014
comment
хорошо, понятно ... Хотя я еще не освоил классы ... Не могли бы вы взглянуть на код, который я собираюсь редактировать, и взглянуть на него? - person RGS; 04.01.2014