2015-05-04 50 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