我已经为一个GUI编写了一个代码,它允许我在3个条目小部件中输入一个电话号码,并在一个单独的小部件中将整个电话号码返回到侧面。我已经设法使用输入验证来限制可以输入到每个小部件中的字符数,也将它们仅限于数字,但是存在一些问题。在
一旦在每个条目中输入第一个数字,就不能用backspace键删除该数字,而且在第一个条目之后,空格键可以填充每个条目中剩余的空格。如何验证空格键(空格)的使用还允许backspace键删除条目小部件的所有内容?在
代码如下:
import tkinter as tk
window=tk.Tk()
window.geometry('325x75+750+350')
window.resizable(width=False,height=False)
window.title('Phone Number Test')
var=tk.StringVar(window,'')
def entrycheckone(inp):
try:
int(inp)
if len(inp) == 3:
entry2.focus_set()
return True
elif len(inp)<3:
return True
else:
return False
return True
except:
return False
def entrychecktwo(inp):
try:
int(inp)
if len(inp) == 3:
entry3.focus_set()
return True
elif len(inp) < 3:
return True
else:
return False
return True
except:
return False
def entrycheckthree(inp):
try:
int(inp)
if len(inp) == 4:
button1.focus_set()
return True
elif len(inp) < 4:
return True
else:
return False
return True
except:
return False
label1=tk.Label(text='Enter Phone Number(XXX-XXX-XXXX):', font='arial 10 bold')
label1.place(anchor='nw', x=38, y=3)
entry1=tk.Entry(width=3, font='arial 10 bold')
entry1.place(anchor='nw', x=3, y=30)
entry1.focus_set()
max1 = window.register(entrycheckone)
entry1.config(validate='key', validatecommand=(max1,'%P'))
label2=tk.Label(text='-', font='arial 20')
label2.place(anchor='nw', x=30, y=19)
entry2=tk.Entry(width=3, font='arial 10 bold')
entry2.place(anchor='nw', x=47, y=30)
max2 = window.register(entrychecktwo)
entry2.config(validate='key', validatecommand=(max2,'%P'))
label3=tk.Label(text='-', font='arial 20')
label3.place(anchor='nw', x=73, y=19)
entry3=tk.Entry(width=4, font='arial 10 bold')
entry3.place(anchor='nw', x=90, y=30)
max3 = window.register(entrycheckthree)
entry3.config(validate='key',validatecommand=(max3, '%P'))
display1=tk.Entry(width=13, textvariable=var, font='arial 10 bold',state='disabled')
display1.place(anchor='nw', x=200, y=30)
def setphone():
num1 = entry1.get()
num2 = entry2.get()
num3 = entry3.get()
wholenum = ('(' + num1 + ')-' + num2 + '-' + num3)
print(wholenum)
var.set(wholenum)
button1=tk.Button(text='ENTER', font='arial 10 bold', command=setphone)
button1.place(anchor='nw', x=130, y=26)
window.mainloop()
另外,是否可以使用一个类更容易地完成这三个方面的验证?我试过了,但失败了。在
谢谢。在
迈克
您应该做的第一件事是将三个几乎相同的
entrycheck
函数转换为单个函数。它们都做着完全相同的事情,只是值不同而已。显而易见的解决方案是使这些值成为函数参数。在问题是tkinter只会将一个参数传递给这个函数。在让tkinter调用这个函数之前,我们需要找到一种方法来包含其他2个参数的值。使用^{} 很容易做到这一点。使用这个,我们可以重写
^{pr2}$到
(在执行此操作之前,必须先创建所有小部件
entry2
、entry3
和button1
,否则会出现名称错误。)这样,我们就可以重写这个函数来接受空字符串并拒绝空格。在
相关问题 更多 >
编程相关推荐