2012-11-06 294 views
3

我想有一個用於輸入日期的輸入框,以便用戶只能以單向輸入。Tkinter - 輸入框 - 格式化爲日期

輸入框中鍵入看起來之前像這樣(沒有下劃線)__/__/____/的不會被刪除,當用戶鍵入日期。

感謝

+1

問題是什麼? – Tim

+0

@Tim我假設OP想要這樣一個輸入框。 – pydsigner

+0

我不相信這是可能的。 – pydsigner

回答

10

由於@Bryan Oakley的主要線索,我已經提出了這方面的工作代碼。

(更新:扔了幾年的編程經驗和近期一些讀者的眼睛是雪亮的,在提高了代碼。)

from __future__ import print_function 

try: 
    import Tkinter as tk 
except ImportError: 
    import tkinter as tk 


class DateEntry(tk.Frame): 
    def __init__(self, master, frame_look={}, **look): 
     args = dict(relief=tk.SUNKEN, border=1) 
     args.update(frame_look) 
     tk.Frame.__init__(self, master, **args) 

     args = {'relief': tk.FLAT} 
     args.update(look) 

     self.entry_1 = tk.Entry(self, width=2, **args) 
     self.label_1 = tk.Label(self, text='/', **args) 
     self.entry_2 = tk.Entry(self, width=2, **args) 
     self.label_2 = tk.Label(self, text='/', **args) 
     self.entry_3 = tk.Entry(self, width=4, **args) 

     self.entry_1.pack(side=tk.LEFT) 
     self.label_1.pack(side=tk.LEFT) 
     self.entry_2.pack(side=tk.LEFT) 
     self.label_2.pack(side=tk.LEFT) 
     self.entry_3.pack(side=tk.LEFT) 

     self.entries = [self.entry_1, self.entry_2, self.entry_3] 

     self.entry_1.bind('<KeyRelease>', lambda e: self._check(0, 2)) 
     self.entry_2.bind('<KeyRelease>', lambda e: self._check(1, 2)) 
     self.entry_3.bind('<KeyRelease>', lambda e: self._check(2, 4)) 

    def _backspace(self, entry): 
     cont = entry.get() 
     entry.delete(0, tk.END) 
     entry.insert(0, cont[:-1]) 

    def _check(self, index, size): 
     entry = self.entries[index] 
     next_index = index + 1 
     next_entry = self.entries[next_index] if next_index < len(self.entries) else None 
     data = entry.get() 

     if len(data) > size or not data.isdigit(): 
      self._backspace(entry) 
     if len(data) >= size and next_entry: 
      next_entry.focus() 

    def get(self): 
     return [e.get() for e in self.entries] 


if __name__ == '__main__':   
    win = tk.Tk() 
    win.title('DateEntry demo') 

    dentry = DateEntry(win, font=('Helvetica', 40, tk.NORMAL), border=0) 
    dentry.pack() 

    win.bind('<Return>', lambda e: print(dentry.get())) 
    win.mainloop() 
+1

如果您將條目窗口小部件的邊框寬度設置爲零,然後將所有窗口小部件放置在邊框寬度爲1(一)的框架中,則它看起來就像一個窗口小部件。否則,出色的工作。不要以爲Tkinter是一個小部件的集合,更像是一箱足球。 –

+0

**哇。** 不是我正在尋找的東西,而是超出它。 謝謝你投入這個時間! 謝謝@pydsigner和@Bryan!你們搖滾:D –

+0

@BryanOakley是的,我很着急在睡覺前把它弄好。我正在完成一個改進版本。 – pydsigner