Форум сайта python.su
Здесь простой пример, настоящяя программа другая. Надо сделать чтобы в 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()
Офлайн
Первый вариант: нужно писать обработчик перехвата нажатых клавиш. Функция-обертка должна пропускать только нажатие цифр. В этом случае заранее закладываются кода допустимых клавиш и на нажатие других клавиш Entry не реагирует вообще.
Второй вариант: писать динамический обработчик анализа изменения данных в виджете Entry. В этом случае просто возможные клавиши не закладываются заранее. При каждом нажатии на любую клавишу проводится анализ данных в поле ввода. И если он не совпадает с возможным (например, ввели букву вместо цифр) - удаляем последний введенный символ и пишем ошибку. Или последний введенный символ выделяем красным и не даем дальше вводит, пока пользователь его не изменит - как Вам будет угодно…
Более кучеряво: можно написать обертку для tkinter в целом, которая позволит назначать тип вводимых данных для отдельных виджетов. Вы не первый кто спрашивает. Я когда-то таку обертку писал, но сейчас уже не найду (уже искал).
Будут вопросы - пишите.
Отредактировано 4kpt_II (Дек. 28, 2013 04:23:42)
Офлайн
Первый вариант думаю лучше. А как этот функцию-обертку писать? Не могли бы советовать что нибудь, а то я новичок…
Офлайн
Написал проще. В виде обработчика событий. Но тут нужно идти двумя этапами:
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()
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()
Отредактировано 4kpt_II (Дек. 28, 2013 15:24:15)
Офлайн
Посидев да поразмыслив, по аналогии с 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)
Офлайн
Офлайн
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()
Отредактировано 4kpt_II (Дек. 29, 2013 18:15:43)
Офлайн