Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Как получать из Entry только цифры? И чтобы только цифры вводились [RSS Feed]

#1 Дек. 28, 2013 03:46:56

Daylet
Зарегистрирован: 2013-12-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

Здесь простой пример, настоящяя программа другая. Надо сделать чтобы в Entry вводилсь только цифры типа int, и получить этих цифр

from tkinter import *
def main(event):
    i=e_ent.get() #Это конечно ошибка но думаю идея понятно
    #Здесь много операций с цифрами типа int
    t_tex.insert(i+i) 
root=Tk()
e_ent=Entry(root,width=15)
t_tex=Text(root,width=15,height=5)
b_but=Button(root,text="Esep")
e_ent.pack()
t_tex.pack()
b_but.pack()
b_but.bind('<Button-1>',main)
root.mainloop()

Офлайн

#2 Дек. 28, 2013 04:17:24

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

Первый вариант: нужно писать обработчик перехвата нажатых клавиш. Функция-обертка должна пропускать только нажатие цифр. В этом случае заранее закладываются кода допустимых клавиш и на нажатие других клавиш Entry не реагирует вообще.

Второй вариант: писать динамический обработчик анализа изменения данных в виджете Entry. В этом случае просто возможные клавиши не закладываются заранее. При каждом нажатии на любую клавишу проводится анализ данных в поле ввода. И если он не совпадает с возможным (например, ввели букву вместо цифр) - удаляем последний введенный символ и пишем ошибку. Или последний введенный символ выделяем красным и не даем дальше вводит, пока пользователь его не изменит - как Вам будет угодно…

Более кучеряво: можно написать обертку для tkinter в целом, которая позволит назначать тип вводимых данных для отдельных виджетов. Вы не первый кто спрашивает. Я когда-то таку обертку писал, но сейчас уже не найду (уже искал).

Будут вопросы - пишите.

Отредактировано 4kpt_II (Дек. 28, 2013 04:23:42)

Офлайн

#3 Дек. 28, 2013 04:45:51

Daylet
Зарегистрирован: 2013-12-28
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

Первый вариант думаю лучше. А как этот функцию-обертку писать? Не могли бы советовать что нибудь, а то я новичок…

Офлайн

#4 Дек. 28, 2013 13:52:49

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

Написал проще. В виде обработчика событий. Но тут нужно идти двумя этапами:

1. Запускаете код и получаете кода всех цифр (не забудьте дополнительную клавиатуру):

import Tkinter
#
#
def main(event):
    for cod in keys:
        l_lsb.insert("end", "cod: %s - key: %s" %(cod, keys[cod]))
#
#
def analysis(event):
    keys[event.keysym_num] = event.keysym
#
keys = {}
#
root = Tkinter.Tk()
#
e_ent = Tkinter.Entry(root, width=15)
e_ent.bind("<Any-KeyPress>", analysis)
e_ent.focus_force()
e_ent.bindtags(e_ent)
e_ent.pack()
#
l_lsb = Tkinter.Listbox(root, width=15, height=5)
l_lsb.pack()
#
b_but = Tkinter.Button(root, text="Esep")
b_but.bind('<Button-1>', main)
b_but.pack()
#
root.mainloop()

2. На основе полученных данных формируете словарь и подставляете его в функцию обработчик

import Tkinter
#
#
def main(event):
    for cod in keys:
        l_lsb.insert("end", "cod: %s - key: %s" %(cod, keys[cod]))
#
#
def analysis(event):
    #keys = ?
    e_ent.insert("end", keys.get(event.keysym_num, ""))
#
root = Tkinter.Tk()
#
e_ent = Tkinter.Entry(root, width=15)
e_ent.bind("<Any-KeyPress>", analysis)
e_ent.focus_force()
e_ent.bindtags(e_ent)
e_ent.pack()
#
l_lsb = Tkinter.Listbox(root, width=15, height=5)
l_lsb.pack()
#
b_but = Tkinter.Button(root, text="Esep")
b_but.bind('<Button-1>', main)
b_but.pack()
#
root.mainloop()

P.S. Если Вам нужно, чтобы еще работали кнопки перемещения по введенным символам (влево, вправо) и кнопки удаления, то нужно также описывать поведение на основе кодов, но там все более серьезнее.

Будут вопросы - пишите.

Отредактировано 4kpt_II (Дек. 28, 2013 15:24:15)

Офлайн

#5 Дек. 28, 2013 15:11:37

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

Посидев да поразмыслив, по аналогии с JQuery можно отключить работу события. Если же событие допустимо (т.е. входит в список допустимых), то включить обработку события и сгенерировать событие и потом, естественно, опять отключить.

Можно объяснить на пальцах так:
1. Отключаем реакцию виджета на нажатие клавиши и перехватываем их код.
2. Если код из допустимых, то включаем реакцию на нажатие и вызываем нажатие ручками.
3. Опять отключаем реакцию на нажатие, чтобы можно было перехватывать следующее нажатие (фактически возвращаемся к пункту 1)

В этом случае можно перехватывать не только цифры но и другие события. Пример кода:

import Tkinter
#
#
def main(event):
    for cod in keys:
        l_lsb.insert("end", "cod: %s - key: %s" %(cod, keys[cod]))
#
#
def analysis(event):
    keys = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "BackSpace"]
    if event.keysym in keys:
        e_ent.bindtags("Entry")
        e_ent.event_generate("<KeyPress-%s>" % event.keysym)
        e_ent.bindtags(e_ent)
#
root = Tkinter.Tk()
#
e_ent = Tkinter.Entry(root, width=15)
e_ent.bind("<Any-KeyPress>", analysis)
e_ent.focus_force()
e_ent.bindtags(e_ent)
e_ent.pack()
#
l_lsb = Tkinter.Listbox(root, width=15, height=5)
l_lsb.pack()
#
b_but = Tkinter.Button(root, text="Esep")
b_but.bind('<Button-1>', main)
b_but.pack()
#
root.mainloop()

В этом коде будет работать не только клавиши цифр, но и клавиша “забой символа”.

Будут вопросы - пишите.

Отредактировано 4kpt_II (Дек. 28, 2013 15:25:01)

Офлайн

#6 Дек. 29, 2013 15:28:26

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

Офлайн

#7 Дек. 29, 2013 17:55:33

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Как получать из Entry только цифры? И чтобы только цифры вводились

sp3
Код, конечно, рухлядь редкая, но он вместе с NewMexicoTech натолкнул меня на интересную мысль.
Смотрите, как симпатично получается…

import Tkinter
#
class NewEntry(Tkinter.Entry):
#
    def __init__(self, master, **kw):
        Tkinter.Entry.__init__(self, master, **kw)
#
    def __setitem__(self, key, value):
        if key == "validatecommand":
            vfunc = (self.master.register(value),
                     '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
            self.config({"validate": "key", "validatecommand": vfunc})
        else:
            self.config({key: value})
#
#
def new_validate_one(*argv):
    print argv
    return True
#
def new_validate_two(*argv):
    print argv
    return False
#
root = Tkinter.Tk()
#
ent_one = NewEntry(root)
ent_one["validatecommand"] = new_validate_one
ent_one.pack()
ent_one.focus_force()
#
ent_two = NewEntry(root)
ent_two["validatecommand"] = new_validate_two
ent_two.pack()
#
root.mainloop()

P.S. Качнул новую документацию. В старой этого не было. В новую еще внесли ttk… Если надо - обновите.

Отредактировано 4kpt_II (Дек. 29, 2013 18:15:43)

Офлайн

  • Начало
  • » GUI
  • » Как получать из Entry только цифры? И чтобы только цифры вводились[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version