我正在用 python 编写一个程序,它将采用特定格式、电话号码和美元/美分值。如何使 tkinter 具有永久的默认值,不可删除。例如(XXX)-XXX-XXXX?
基本上你可以向小部件添加一个条目,但该条目被定义为永久值,就像它为空时它看起来像 (_ _ _)-___-____ 当它有文本时它看起来像 (434)-332-1234
我正在用 python 编写一个程序,它将采用特定格式、电话号码和美元/美分值。如何使 tkinter 具有永久的默认值,不可删除。例如(XXX)-XXX-XXXX?
基本上你可以向小部件添加一个条目,但该条目被定义为永久值,就像它为空时它看起来像 (_ _ _)-___-____ 当它有文本时它看起来像 (434)-332-1234
如果我理解正确,您需要某种模板,用户可以在其中键入他/她的信息,但仅限于某种格式。您可以使用条目的validatecommand
. 基本上,每当插入某些内容时,它都会调用一个函数,并且可以返回 True 或 False 以接受或拒绝更改。有关其工作原理的更多信息,请参阅Bryan Oakley 的此答案。
在您的情况下,您希望函数在任何具有格式时返回 True (...)-...-....
,您可以使用正则表达式进行检查。您可以使用的正则表达式是^\(\d{0,3}\)-\d{0,3}-\d{0,4}$
.
我会为你解释。^
意味着那应该是字符串的开头,\(
意味着应该有一个(
,\d{0,3}
意味着可以有 0 到 3 个数字(我假设你只想要数字,如果不是,你可以将其更改\w
为接受任何字母或数字)。然后是\)
which 的意思)
, a 的-
字面意思是-
,一些数字和 a -
,最后是 a $
,这意味着应该是字符串的结尾。
您可以在函数中使用此正则表达式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,所以只允许在模式中进行编辑。