Tkinter Ttk Python:将文本输入窗口小部件值限制为数字并限制字符数量

时间:2014-06-05 08:40:16

标签: python tkinter widget ttk

这里可能很简单:在tkinter,ttk,你如何限制用户输入到输入字段的字符数量?例如,仅允许用户插入一个字符并限制插入任何其他字符的能力?

此外,我将如何制作它以便只能将一个intiger输入到所述文本输入字段中,这样它就不允许用户输入任何不是{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 个答案:

答案 0 :(得分:2)

条目小部件支持验证回调,通过设置验证模式(通过validate属性)并提供回调本身(通过validatecommand属性)来指定。不幸的是,关于如何使用它的Tkinter文档很差。

验证模式可以是字符串focusOut(在焦点离开窗口小部件时应用验证)和key(在用户按下键时应用它)。并focusfocusIn但我发现它们没那么有用。

验证回调应返回一个布尔值,指出当前(= {new,在key验证的情况下)内容是否有效。如果验证失败,则拒绝更改(内容被重置)并调用无效内容回调(通过invalidcommand属性),这可以执行诸如发出铃声或使屏幕闪烁等操作。


更复杂的验证机制是始终正式声称编辑有效,但更改条目的背景(或使用其他指标)以显示编辑将被拒绝。然后,只对表格的整体提交进行完全验证/拒绝(无论如何,你打算这样做,是吗?)。这样,只要用户在完成会话之前返回并修复它们,就会允许暂时无效的状态。这是非常有用的。

答案 1 :(得分:1)

您可以使用spinbox仅输入整数并指定值的范围。例如,以下示例中指定的旋转框将限制用户仅选择范围0-9

的值
from Tkinter import *
master = Tk()
w = Spinbox(master, from_=0, to=9)
w.pack()
mainloop()