-2

我正在用 python 编写一个程序,它将采用特定格式、电话号码和美元/美分值。如何使 tkinter 具有永久的默认值,不可删除。例如(XXX)-XXX-XXXX?

基本上你可以向小部件添加一个条目,但该条目被定义为永久值,就像它为空时它看起来像 (_ _ _)-___-____ 当它有文本时它看起来像 (434)-332-1234

4

1 回答 1

0

如果我理解正确,您需要某种模板,用户可以在其中键入他/她的信息,但仅限于某种格式。您可以使用条目的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,所以只允许在模式中进行编辑。

于 2015-05-04T09:07:08.347 回答