1

ユーザーの入力に合わせてテキストを時刻形式にフォーマットする

00:00:00ユーザーが数字を入力すると、テキストを Tk.Entry テキストボックスの標準時間形式にフォーマットしようとしています。

Tkinter は、ユーザーの入力中にテキストをフォーマットするための最も簡単なフレームワークでも、最適化されたフレームワークでもないことを理解していますが、ここまで到達することができました。

from Tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()


    def createWidgets(self):
        sv = StringVar()
        sv.trace("w", lambda name, index, mode, sv=sv: self.entryUpdateEndHour(sv))
        endHourEntry = Entry(self, textvariable=sv)
        endHourEntry.pack()

    def entryUpdateEndHour(self, sv):
        global x

        x = sv.get()[0:2] + ':'
        y = x + sv.get()[3:5] + ':'
        z = y + sv.get()[6:8]

        sv.set(z)


root = Tk() 
app = Application(master=root) 
app.mainloop()

これは私が望むものを正確に出力します ( 12:45:67) が、ライブ フォーマットは良くありません。たとえば、2 つの数字を入力する12:::と、テキスト ボックスに表示され、入力した 3 番目の数字が:.

誰かがこの回答に対する回避策または解決策を持っている場合、私は非常に感謝しています。前もって感謝します。

4

2 に答える 2

3

これが私の解決策です:

from Tkinter import *

class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        sv = StringVar()
        endHourEntry = Entry(self, textvariable=sv)
        sv.trace("w", lambda name, index, mode, sv=sv: 
                             entryUpdateEndHour(endHourEntry))
        endHourEntry.pack()

def entryUpdateEndHour(entry):
    text = entry.get()
    if len(text) in (2,5):
        entry.insert(END,':')
        entry.icursor(len(text)+1)
    elif len(text) not in (3,6):
        if not text[-1].isdigit():
            entry.delete(0,END)
            entry.insert(0,text[:-1])
    if len(text) > 8:
        entry.delete(0,END)
        entry.insert(0,text[:8])


root = Tk() 
app = Application(master=root) 
app.mainloop()

私にとっては、StringVar を直接操作するよりも、エントリ ウィジェットを操作する方が簡単です。stringvar を含める唯一の理由は、コールバックが適切に呼び出されるようにトレース動作を取得することです。vcmd別のオプションは、 Entry コンストラクターのオプションを使用して何かを行うことですが、それでエントリを更新することはできないようです...コンテンツのみを検証します。

于 2013-06-20T14:02:23.123 に答える