我需要使用tkinter python来定义一个只接受带有8个整数和2个小数的浮点字段的输入字段,如果它不遵循格式8.2,可能会带有错误消息。您可以帮我定义此字段的格式。
答案 0 :(得分:1)
Entry包含选项validate=
和validatecommand=
,您可以在Interactively validating Entry widget content in tkinter
但是你也可以将事件<KeyRelease>
绑定到执行函数,你可以用它来检查Entry中的值。
我用dot分割文字。如果我得到超过2个部分,则有超过2个点。
之后我检查第二部分是否存在,不是空的,只有数字并且不超过8个字符。类似的方式我检查第一部分。
当字符串无效时,我只在控制台中打印消息,但您可以执行更多操作 - 您可以在Entry
中显示消息框或替换文本。
import tkinter as tk
def check(event):
text = event.widget.get()
print('text:', text)
parts = text.split('.')
parts_number = len(parts)
if parts_number > 2:
print('too much dots')
if parts_number > 1 and parts[1]: # don't check empty string
if not parts[1].isdecimal() or len(parts[1]) > 2:
print('wrong second part')
if parts_number > 0 and parts[0]: # don't check empty string
if not parts[0].isdecimal() or len(parts[0]) > 8:
print('wrong first part')
root = tk.Tk()
e = tk.Entry(root)
e.pack()
e.bind('<KeyRelease>', check)
root.mainloop()
编辑:示例validate=
- 基于上面第二个链接的示例。
功能check()
大部分没有变化。它仅使用return True/False
而不是打印消息。它会阻止无效值。
import tkinter as tk
def check(d, i, P, s, S, v, V, W):
#print("d='%s'" % d)
#print("i='%s'" % i)
#print("P='%s'" % P)
#print("s='%s'" % s)
#print("S='%s'" % S)
#print("v='%s'" % v)
#print("V='%s'" % V)
#print("W='%s'" % W)
text = P #e.get()
print('text:', text)
parts = text.split('.')
parts_number = len(parts)
if parts_number > 2:
#print('too much dots')
return False
if parts_number > 1 and parts[1]: # don't check empty string
if not parts[1].isdecimal() or len(parts[1]) > 2:
#print('wrong second part')
return False
if parts_number > 0 and parts[0]: # don't check empty string
if not parts[0].isdecimal() or len(parts[0]) > 8:
#print('wrong first part')
return False
return True
# --- main ---
root = tk.Tk()
vcmd = (root.register(check), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
e = tk.Entry(root, validate='key', validatecommand=vcmd)
e.pack()
root.mainloop()