Форум сайта python.su
0
Дайте пожалуйста пример, как проверять правильность значений в форме
например:
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()
Офлайн
0
Я бы подумал о событии по таймеру.
При этом пусть события возникают, например, каждые 0.2 сек.
В обработчике тупо проверяешь все поля на свои правила (для проверки на число и ASCII есть функции).
А вот на соответствие кодовой страницы - я пока не знаю (новичок).
Что интересно: пользователь вводит цифры и как только следующий символ буква, ты его “ругаешь”, скажем, пикаешь или меняешь цвет поля и, например, удаляешь неправильный символ …
Как-то так, …
Офлайн
0
я думала в сторону классов копать на Entry, но не получается
хотела бы пример.
насчет 0,2 сек , разве это не замедлит работу?
и желательна проверка не на нажатие клавиш в поле, а при попытке ухода из поля.
На сегодня я могу сделать проверку при нажатии кнопки “Сохранить данные” но этот вариант хуже.
Знаю точно, что возможность есть, просто мои знания еще мизерны 
Офлайн
294
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()
[code python][/code]
Отредактировано PEHDOM (Авг. 7, 2017 11:05:32)
Офлайн
0
О. да, а как еще сделать, чтоб при нажатии на “ENTER” фокус переходил на следующее поле как и при нажатии “TAB”
Офлайн
294
через метод 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()
[code python][/code]
Отредактировано PEHDOM (Авг. 7, 2017 22:51:55)
Офлайн
0
Еще раз спасибо!
В этой же статье и ответ на 3-й мой вопрос есть 
root.bind_class('Entry', ‘<Return>’, nextWidget)
Офлайн