Tkinter Ttk Python:限制文本输入控件为数字并限制字符数量
这里有个简单的问题:在tkinter的ttk中,怎么限制用户在输入框里输入的字符数量?比如说,只允许用户输入一个字符,不能再输入其他的。
另外,我还想知道怎么设置,让这个文本输入框只能输入整数,这样用户就不能输入任何不是0到9之间的字符。
谢谢 :) 顺便说一下,我对编程还比较陌生,所以越简单越好 :)
如果这能帮助你理解该怎么做,这里是我目前的程序:
from tkinter import *
from tkinter import ttk
def calculate(*args):
try:
valuex=int(x.get())
valuey=int(y.get())
valuez=int(z.get())
cappf.set(int(str(valuex)+str(valuey))*10**valuez)
capnf.set(int(str(valuex)+str(valuey))*10**valuez*10**-3)
capuf.set(int(str(valuex)+str(valuey))*10**valuez*10**-6)
except ValueError:
pass
root=Tk()
root.title('Capacitor Calculator')
mainframe=ttk.Frame(root, padding='10 10 10 10')
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
x=StringVar()
x_entry=ttk.Entry(mainframe, width=3, textvariable=x)
x_entry.grid(column=1, row=2, sticky=(W,E))
y=StringVar()
y_entry=ttk.Entry(mainframe, width=3, textvariable=y)
y_entry.grid(column=1, row=3, sticky=(W,E))
z=StringVar()
z_entry=ttk.Entry(mainframe, width=3, textvariable=z)
z_entry.grid(column=1, row=4, sticky=(W,E))
cappf=StringVar()
capnf=StringVar()
capuf=StringVar()
ttk.Button(mainframe, width=7, text='Calculate', command=calculate).grid(column=2, row=5, sticky=(N, E, S, W))
ttk.Label(mainframe, textvariable=cappf).grid(column=2, row=2, sticky=N)
ttk.Label(mainframe, textvariable=capnf).grid(column=2, row=3, sticky=N)
ttk.Label(mainframe, textvariable=capuf).grid(column=2, row=4, sticky=N)
ttk.Label(mainframe, text='Input:').grid(column=1, row=1, sticky=N)
ttk.Label(mainframe, text='Amount:').grid(column=2, row=1, sticky=N)
ttk.Label(mainframe, text='Units:').grid(column=3, row=1, sticky=N)
ttk.Label(mainframe, text='pf').grid(column=3, row=2, sticky=N)
ttk.Label(mainframe, text='nf').grid(column=3, row=3, sticky=N)
ttk.Label(mainframe, text='uf').grid(column=3, row=4, sticky=N)
ttk.Button(mainframe, width=7, text='Quit', style='red.TButton', command=root.destroy).grid(column=2, row=6, sticky=(N, E, S, W))
ttk.Style().configure('red.TButton', foreground='red', padding=6, font='Corbel 18')
ttk.Style().configure('TLabel', padding=6, font='Corbel 16', foreground='#0077AF')
ttk.Style().configure("TButton", padding=6, relief="flat", font='Corbel 18', foreground='#00AA11')
for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=3)
x_entry.focus()
y_entry.focus()
z_entry.focus()
root.bind('<Return>', calculate)
root.mainloop()
2 个回答
1
你可以使用 spinbox 来输入整数,并且可以设置值的范围。例如,下面这个例子中的spinbox会限制用户只能选择0到9之间的数字。
from Tkinter import *
master = Tk()
w = Spinbox(master, from_=0, to=9)
w.pack()
mainloop()
2
这个输入框(entry widget)支持一种验证功能,你可以通过设置验证模式(用 validate
属性)和提供验证回调函数(用 validatecommand
属性)来实现。不过,Tkinter 的文档在这方面的说明实在是太少了。
验证模式可以是字符串 focusOut
(当输入框失去焦点时进行验证)和 key
(当用户按下键盘时进行验证)。还有 focus
和 focusIn
,但我觉得它们用处不大。
验证回调函数应该返回一个布尔值,表示当前的内容(在 key
验证的情况下是新的内容)是否有效。如果验证失败,内容就会被拒绝(会重置为之前的内容),并且会调用无效内容的回调函数(通过 invalidcommand
属性),这个函数可以做一些事情,比如响铃或者让屏幕闪烁。
一种更复杂的验证机制是,始终官方地声称编辑是有效的,但可以改变输入框的背景颜色(或者用其他方式)来显示这个编辑将会被拒绝。然后,只有在提交整个表单时才进行全面的验证和拒绝(反正你本来就打算这么做,对吧?)。这样,只要用户在结束会话之前回去修正这些临时无效的状态,就可以允许这些状态。这种方式要更友好得多。