我正在尝试将文本格式化为Tk.Entry文本框中00:00:00
的标准时间格式,因为用户输入数字。
据我所知,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
),但实时格式不好。例如,在键入两个数字时,我会在文本框中显示12:::
,并且它会跳过我输入的每个第3个数字,因为它会将其替换为:
。
如果有人有任何解决方法或解决方案,我将非常感激。提前谢谢。
答案 0 :(得分:2)
这是我的解决方案:
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
option对Entry构造函数执行某些操作,但我似乎无法更新条目...仅验证内容。
答案 1 :(得分:0)
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))
self.endHourEntry = Entry(self, textvariable=sv)
self.endHourEntry.pack()
print [x for x in dir(self.endHourEntry) if 'set' in x]
def entryUpdateEndHour(self, sv):
digits = filter(str.isdigit, sv.get())
sv.set('{}:{}:{}'.format(digits[:2], digits[2:4], digits[4:]))
self.endHourEntry.icursor(END)
root = Tk()
app = Application(master=root)
app.mainloop()
问题:光标总是结束。我对此并不了解。