我正在编写一个python程序,它将采用特定格式,电话号码和美元/分值。如何让tkinter具有永久性的默认值,而不是可删除的。例如(XXX)-XXX-XXXX?
基本上你可以在窗口小部件中添加一个条目但是该条目被定义为永久值,就像它的空白时看起来像(_ _ _)-___-____,当它看起来像文本时(434)-332-1234
答案 0 :(得分:0)
如果我理解正确,您需要某种模板,用户可以在其中键入他/她的信息,但仅限于某种格式。您可以使用条目validatecommand
执行此操作。基本上,只要插入某些内容,它就会调用一个函数,并且可以返回True或False来接受或拒绝更改。有关其工作原理的详细信息,请参阅this answer by Bryan Oakley。
在您的情况下,您希望函数在格式为(...)-...-....
的情况下返回True,您可以使用正则表达式进行检查。您可以使用的正则表达式为^\(\d{0,3}\)-\d{0,3}-\d{0,4}$
我会为你解释一下。 ^
表示应该是字符串的开头,\(
表示应该有(
,\d{0,3}
表示可以有0到3个数字(我假设你只想要数字,如果没有,你可以改为\w
接受任何字母或数字)。然后是\)
,表示)
,-
,字面意思是-
,一些数字和-
,最后是$
这意味着应该是字符串的结尾。
您可以在validatecommand
函数中使用此正则表达式,通过使用以下内容检查条目是否具有正确的格式:
import Tkinter as tk
import re
class MyApp():
def __init__(self):
self.root = tk.Tk()
vcmd = (self.root.register(self.OnValidate), '%P')
self.entry = tk.Entry(self.root, validate="key",
validatecommand=vcmd)
self.entry.pack()
self.prog = re.compile('^\(\d{0,3}\)-\d{0,3}-\d{0,4}$')
self.entry.insert(0, '()--')
self.root.mainloop()
def OnValidate(self, P):
if self.prog.match(P):
result = True
else:
result = False
return result
app=MyApp()
我使用之前链接的答案作为模板,删除了您的特定情况不需要的所有内容并插入了正则表达式。因为它只在字符串与模式匹配时返回True,所以只允许符合模式的编辑。