Найти - Пользователи
Полная версия: проверка заполнения .bind
Начало » Python для новичков » проверка заполнения .bind
1
lubocka
Дайте пожалуйста пример, как проверять правильность значений в форме
например:
 from tkinter import *
root = Tk()
form = Frame(root, padx=8, pady=8)
l0 = Label(form, text="поле 0) число: ")
l1 = Label(form, text="поле 1) текст: ")
l2 = Label(form, text="поле 2) укр.текст: ")
l3 = Label(form, text="поле 3) укр.текст: ")
l0.grid(row=0, column=0, sticky=E)
l1.grid(row=0, column=3, sticky=E)
l2.grid(row=1, column=0, sticky=E)
l3.grid(row=1, column=3, sticky=E)
e0 = Entry(form)
e1 = Entry(form)
e2 = Entry(form)
e3 = Entry(form)
e0.grid(row=0, column=2)
e1.grid(row=0, column=4)
e2.grid(row=1, column=2)
e3.grid(row=1, column=4)
e0.focus_set()
def CheckRec(event):
    pass
e0.bind("<Double-Button-1>",CheckRec)
e0.bind("<Return>",CheckRec)
e0.bind("<Tab>",CheckRec)
e0.bind("<Shift-Tab>",CheckRec)
form.pack()
root.mainloop()

вопросы:
1) в полях где числа сделать проверку на введение чисел
в полях где текст сделать проверку на введение текста, притом определенную, например только украинский или е-майл, или еще какое-то пожелание.

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

2) при нажатии “ENTER” вызывается моя функция CheckRec, но нету перехода на следующее поле как при нажатии “TAB”

3) я не хочу прописывать .bind() буквально к каждому полю
ViktorR
Я бы подумал о событии по таймеру.
При этом пусть события возникают, например, каждые 0.2 сек.
В обработчике тупо проверяешь все поля на свои правила (для проверки на число и ASCII есть функции).
А вот на соответствие кодовой страницы - я пока не знаю (новичок).
Что интересно: пользователь вводит цифры и как только следующий символ буква, ты его “ругаешь”, скажем, пикаешь или меняешь цвет поля и, например, удаляешь неправильный символ …


Как-то так, …
lubocka
я думала в сторону классов копать на Entry, но не получается

хотела бы пример.

насчет 0,2 сек , разве это не замедлит работу?
и желательна проверка не на нажатие клавиш в поле, а при попытке ухода из поля.
На сегодня я могу сделать проверку при нажатии кнопки “Сохранить данные” но этот вариант хуже.
Знаю точно, что возможность есть, просто мои знания еще мизерны
PEHDOM
lubocka данунах пять раз в секунду проходить по всем виджетам, а если у вас 500 ячеек ? А если 5К ?
Вот читаем сколько всего можно сделать http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
там есть событие <FocusOut> на него цепляешь проверку примерно так:
 from tkinter import *
root = Tk()
form = Frame(root, padx=8, pady=8)
l0 = Label(form, text="поле 0) число: ")
l1 = Label(form, text="поле 1) текст: ")
l2 = Label(form, text="поле 2) укр.текст: ")
l3 = Label(form, text="поле 3) укр.текст: ")
l0.grid(row=0, column=0, sticky=E)
l1.grid(row=0, column=3, sticky=E)
l2.grid(row=1, column=0, sticky=E)
l3.grid(row=1, column=3, sticky=E)
e0 = Entry(form)
e1 = Entry(form)
e2 = Entry(form)
e3 = Entry(form)
e0.grid(row=0, column=2)
e1.grid(row=0, column=4)
e2.grid(row=1, column=2)
e3.grid(row=1, column=4)
e0.focus_set()
def CheckInt(event):
    # проверка значений на целочисленность
    widget = event.widget  # виджет с которого "ушли"
    text = widget.get()    # получаем текст виджета
    try:
        int(text)         # простейшая проверка на целочисленность
    except (ValueError,TypeError):
        print(text, 'это не число, попробуйте исправить')
        widget.focus()    #  если проверку не прошли возвращаем фокус ввода на наш виджет
e0.bind("<FocusOut>",CheckInt)
form.pack()
root.mainloop()
А уж на классах писать или на процедурах тут смотри по обстоятельствам.
lubocka
О. да, а как еще сделать, чтоб при нажатии на “ENTER” фокус переходил на следующее поле как и при нажатии “TAB”
PEHDOM
через метод tk_focusNext https://ru.wikiversity.org/wiki/%D0%9A%D1%83%D1%80%D1%81_%D0%BF%D0%BE_%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B5_Tkinter_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0_Python#.D0.9A.D0.BB.D0.B0.D1.81.D1.81_Tk
 from tkinter import *
root = Tk()
form = Frame(root, padx=8, pady=8)
l0 = Label(form, text="поле 0) число: ")
l1 = Label(form, text="поле 1) текст: ")
l2 = Label(form, text="поле 2) укр.текст: ")
l3 = Label(form, text="поле 3) укр.текст: ")
l0.grid(row=0, column=0, sticky=E)
l1.grid(row=0, column=3, sticky=E)
l2.grid(row=1, column=0, sticky=E)
l3.grid(row=1, column=3, sticky=E)
e0 = Entry(form)
e1 = Entry(form)
e2 = Entry(form)
e3 = Entry(form)
e0.grid(row=0, column=2)
e1.grid(row=0, column=4)
e2.grid(row=1, column=2)
e3.grid(row=1, column=4)
e0.focus_set()
def CheckInt(event):
    # проверка значений на целочисленность
    widget = event.widget  # виджет с которого "ушли"
    text = widget.get()    # получаем текст виджета
    try:
        int(text)         # простейшая проверка на целочисленность
    except (ValueError,TypeError):
        print(text, 'это не число, попробуйте исправить')
        widget.focus()    #  если проверку не прошли возвращаем фокус ввода на наш виджет
def nextWidget(event):
    event.widget.tk_focusNext().focus() # передаем фокус следующему виджету
e0.bind("<FocusOut>",CheckInt)
root.bind('<Return>', nextWidget)
form.pack()
root.mainloop()
lubocka
Еще раз спасибо!
В этой же статье и ответ на 3-й мой вопрос есть
root.bind_class('Entry', ‘<Return>’, nextWidget)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB