Найти - Пользователи
Полная версия: Entry (маска ввода) tkinter
Начало » GUI » Entry (маска ввода) tkinter
1
Ubhra
Добрый день.
Нужно поле ввода для 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()
4kpt
Специального метода не существует. Нужно пилить самостоятельно. Для этого придеться перехватывать события нажатия клавиш в каждом из восьми полей ввода. Далее анализировать данные. Если данные не соответствуют истине, то при переходе на другой виджет подкрашивать предыдущий красным цветом и выводить пояснения. Как-то так.

Пример по анализу данных с поля ввода следующий.

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()
Ubhra
У меня 3.3, а там добавили библиотеку, пытаюсь ее понять.
http://docs.python.org/3.3/library/ipaddress.html
4kpt
Тогда “вперед”… Я на тройке на работаю :)
Griffon
Как-то так. : )
Любой не числовой символ, в том числе пробел, переносит курсор на следующую позицию. Получается почти идеально, ввел одно число, пробел, перенесло за точку.
А вот зачем 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()
4kpt
Griffon
Итересненько. Взял на заметку метод .trace()
Но все равно получается не очень, так как допустимым считается адресс 333.333.333.333.
Нужно еще допиливать :)
Griffon
Ну я ведь сказал “почти” : )
Добавить проверку дело нехитрое.

Вообще в ttk.entry есть встроенная функция валидации, но почему-то она проверяет прошлое значение, а не вновь введенное. Возможно я просто не умею её готовить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB