我正在用Py和Tkinter (Ttkinter)编写我的第一个GUI应用程序。我想确保用户只能写数字,","one_answers"!"在条目字段中。到目前为止,我这样做了,但我有几个问题:
-
我无法让它接受","one_answers"!">
-
使用此方法,我不能使用我编写的清洁函数来清理条目小部件。
#Validation function
def dig_check(input):
if input.isdigit():
print(input)
return True
else:
print(input)
return False
#Clean function
def clean_calc():
r_top_entry.delete(0,END)
r_bot_entry.delete(0,END)
p_thick_entry.delete(0,END)
b_angle_deg_entry.delete(0,END)
b_angle_m_entry.delete(0,END)
b_angle_s_entry.delete(0,END)
b_height_entry.delete(0,END)
De_label.config(text="-")
Dm_label.config(text="-")
Di_label.config(text="-")
de_label.config(text="-")
dm_label.config(text="-")
di_label.config(text="-")
deg_value.config(text="-")
min_value.config(text="-")
sec_value.config(text="-")
#Entry widget example
r_top_entry = ttk.Entry(blank_frame, width=10, validate="key", validatecommand=(root.register(dig_check),"%P"))
有人能帮我解释一下我做错了什么吗?
您需要修改验证器以接受其他字符
def dig_check(usr_input):
# accept digits, '.', ',', or empty values
char = usr_input[-1] # get the latest character added to the Entry
if char.isdigit() or char in '.,' or char == '':
return True
return False
最好也接受空值,这样用户就可以删除Entry
的内容。您需要在事实之后检查这些,但如果您没有在这里捕获它们,您的Entry
将始终必须具有一些值,这可能不是您想要的。
注意,这也将允许多个连续的'。'和','字符,并且不会指定允许这些字符的位置。对于更严格的要求,您可能需要查看RegEx。
此外,我已将input
更改为usr_input
,因为input
是保留字(它是一个函数)
如果你想在你的验证中有更多的规定(通常,你应该!),你可以这样做:
import re
def dig_check(usr_input):
pattern = re.compile(r'^d+(?:,?d*)*.?d*$|^$')
if re.search(pattern, user_input):
return True
return False
请记住,这里的RegEx模式不是详尽的,并且可以允许像多个连续逗号这样的事情…我只是在证明一个观点!