2015-05-04 52 views
-2

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

基本上,您可以添加一个条目到窗口小部件,但该条目被定义为永久值,就像它的空时它看起来像(__ ____)____ ____当它具有文本时它看起来像(434)-332- 1234

+0

你将不得不更多地解释一下你的意思是一个永久的,不可删除的默认值,而且是一个'Entry'。 – TigerhawkT3

+0

基本上,你可以添加一个条目到窗口小部件,但是条目被定义为永久值,就像它的空时它看起来像(__ ____)____ ____当它有文本时它看起来像(434)-332-1234 – Amao

回答

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,所以只允许编辑符合模式的编辑。

+0

没有给出非常好的用户体验。作为用户,您没有看到实际的模板,也不知道应该输入什么内容。 –

+0

是的,这是真的。这是第一份草案,考虑到这个问题并不清楚确切的行为应该是什么,但完全没有OP的反馈意见阻止了我想要改进它。也许我会在某个时候改进它。我主要将这个问题与其他问题联系在一起,因为我对这个问题几乎完全一样,只有两天的时间感到惊讶。 – fhdrsdg