2012-11-06 252 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