Форум сайта python.su
Добрый день.
Нужно поле ввода для ip адреса. Использовал Entry.
Возможно ограничить ввод маской?
Для одного ip адреса 4 поля. В каждое разрешить ввод 3 символов в десятичном формате до 255.
И как бы при вводе в поле 1, 3 символов, автоматически перескакивать на 2 поле?
Спасибо.
from tkinter import * def rb_1(): rb2.config(fg='black') rb1.config(fg='blue') def rb_2(): rb1.config(fg='black') rb2.config(fg='blue') search=Tk() search.title("search") search.minsize (600, 400) search.maxsize (600, 400) search_x=(search.winfo_screenwidth()/2-600/2) search_y=(search.winfo_screenheight()/2-400/2) search.geometry("%dx%d+%d+%d"%(600,400,search_x,search_y)) search2=Frame(search,bg='green') search3=Frame(search,bg='red') rb1=Radiobutton(search2,text='One address',command=rb_1,value=1) rb2=Radiobutton(search2,text='Address range',command=rb_2,value=2) rb1.select() rb1.config(fg='blue') adr1=Entry(search3,width=3) adr2=Entry(search3,width=3) adr3=Entry(search3,width=3) adr4=Entry(search3,width=3) adr5=Entry(search3,width=3) adr6=Entry(search3,width=3) adr7=Entry(search3,width=3) adr8=Entry(search3,width=3) rb1.grid(row=0,sticky='WN',padx=10,pady=5) rb2.grid(row=1,sticky='WN',padx=10) adr1.grid(row=0,sticky='WN',padx=15,pady=5) adr2.grid(row=0,sticky='WN',padx=45,pady=5) adr3.grid(row=0,sticky='WN',padx=75,pady=5) adr4.grid(row=0,sticky='WN',padx=105,pady=5) adr5.grid(row=0,sticky='WN',padx=15,pady=30) adr6.grid(row=0,sticky='WN',padx=45,pady=30) adr7.grid(row=0,sticky='WN',padx=75,pady=30) adr8.grid(row=0,sticky='WN',padx=105,pady=30) search2.place(x=0,y=0,width=150,height=60) search3.place(x=0,y=60,width=150,height=55) search.mainloop()
Отредактировано Ubhra (Март 29, 2013 09:53:23)
Офлайн
Специального метода не существует. Нужно пилить самостоятельно. Для этого придеться перехватывать события нажатия клавиш в каждом из восьми полей ввода. Далее анализировать данные. Если данные не соответствуют истине, то при переходе на другой виджет подкрашивать предыдущий красным цветом и выводить пояснения. Как-то так.
Пример по анализу данных с поля ввода следующий.
import Tkinter root = Tkinter.Tk() def analysis(event): data = ent.get() if len(data) == 3: if not data.isdigit(): print "Program need a digit..." ent["bg"] = "red" else: print "I can work further..." ent["bg"] = "green" ent = Tkinter.Entry(root) ent.bind("<Any-KeyRelease>", analysis) ent.pack() ent.focus_force() root.mainloop()
Офлайн
У меня 3.3, а там добавили библиотеку, пытаюсь ее понять.
http://docs.python.org/3.3/library/ipaddress.html
Офлайн
Тогда “вперед”… Я на тройке на работаю :)
Офлайн
Как-то так. : )
Любой не числовой символ, в том числе пробел, переносит курсор на следующую позицию. Получается почти идеально, ввел одно число, пробел, перенесло за точку.
А вот зачем 4 поля, не понимаю.
from Tkinter import * import re root = Tk() ip_entry_string = StringVar() ip_entry = Entry(root, textvariable=ip_entry_string) ip_entry.pack() def entry_mask_check(text, valid, entry): ip = re.findall("^\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}$",text.get()) if len(ip) != 1: text.set(valid[0]) if ip: valid[0] = ip[0] #jump next on 3 didgits cursor_position = entry.index("insert") index = ip[0][:cursor_position].rfind(u".") if cursor_position - index == 4: entry.icursor(cursor_position+1) ip_entry_string_last_valid = [u"..."] ip_entry_string.trace("w", lambda *args: entry_mask_check(ip_entry_string, ip_entry_string_last_valid, ip_entry)) ip_entry_string.set("") ip_entry.focus() root.mainloop()
Отредактировано Griffon (Март 31, 2013 19:38:36)
Офлайн
Griffon
Итересненько. Взял на заметку метод .trace()
Но все равно получается не очень, так как допустимым считается адресс 333.333.333.333.
Нужно еще допиливать :)
Отредактировано 4kpt (Март 31, 2013 20:03:06)
Офлайн
Ну я ведь сказал “почти” : )
Добавить проверку дело нехитрое.
Вообще в ttk.entry есть встроенная функция валидации, но почему-то она проверяет прошлое значение, а не вновь введенное. Возможно я просто не умею её готовить.
Отредактировано Griffon (Март 31, 2013 22:37:32)
Офлайн