Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 6, 2017 18:08:49

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка заполнения .bind

Дайте пожалуйста пример, как проверять правильность значений в форме
например:

 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() буквально к каждому полю

Офлайн

#2 Авг. 7, 2017 01:15:59

ViktorR
Зарегистрирован: 2017-06-25
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка заполнения .bind

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


Как-то так, …

Офлайн

#3 Авг. 7, 2017 08:56:38

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка заполнения .bind

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

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

насчет 0,2 сек , разве это не замедлит работу?
и желательна проверка не на нажатие клавиш в поле, а при попытке ухода из поля.
На сегодня я могу сделать проверку при нажатии кнопки “Сохранить данные” но этот вариант хуже.
Знаю точно, что возможность есть, просто мои знания еще мизерны

Офлайн

#4 Авг. 7, 2017 10:40:37

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

проверка заполнения .bind

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)

Офлайн

#5 Авг. 7, 2017 21:40:02

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка заполнения .bind

О. да, а как еще сделать, чтоб при нажатии на “ENTER” фокус переходил на следующее поле как и при нажатии “TAB”

Офлайн

#6 Авг. 7, 2017 22:51:23

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

проверка заполнения .bind

через метод 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)

Офлайн

#7 Авг. 8, 2017 00:42:38

lubocka
Зарегистрирован: 2017-06-11
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

проверка заполнения .bind

Еще раз спасибо!
В этой же статье и ответ на 3-й мой вопрос есть
root.bind_class('Entry', ‘<Return>’, nextWidget)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version