Tkinter Ttk Python:限制文本输入控件为数字并限制字符数量

0 投票
2 回答
2951 浏览
提问于 2025-04-18 08:41

这里有个简单的问题:在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(当用户按下键盘时进行验证)。还有 focusfocusIn,但我觉得它们用处不大。

验证回调函数应该返回一个布尔值,表示当前的内容(在 key 验证的情况下是新的内容)是否有效。如果验证失败,内容就会被拒绝(会重置为之前的内容),并且会调用无效内容的回调函数(通过 invalidcommand 属性),这个函数可以做一些事情,比如响铃或者让屏幕闪烁。


一种更复杂的验证机制是,始终官方地声称编辑是有效的,但可以改变输入框的背景颜色(或者用其他方式)来显示这个编辑将会被拒绝。然后,只有在提交整个表单时才进行全面的验证和拒绝(反正你本来就打算这么做,对吧?)。这样,只要用户在结束会话之前回去修正这些临时无效的状态,就可以允许这些状态。这种方式要更友好得多。

撰写回答