如何获取tkinter Entry组件列表的最后一个值。
我有一组 n 个输入框(Entry widgets)。每个输入框只能输入一个字符,输入完后光标会自动跳到下一个输入框。我想要获取这 n 个输入框的值,但我总是无法获取到最后一个输入框的值。下面是示例代码:
import Tkinter as tk
def vf(event):
actual=entrylist.index(root.focus_get())
print "--",len(entrylist),actual
if event.char.upper() in ('V', 'F', ' '):
print event.char
if actual<len(entrylist)-1:
entrylist[actual+1].focus_set()
else:
#set focus to another widget?
for x in entrylist:
print "-",x.get(),"-"
#the last character is lost!
elif event.keysym not in ('Alt_r', 'Alt_L', 'F4'):
print event.keysym
return 'break'
root= tk.Tk()
entrylist=[]
for i in xrange(4):
e=tk.Entry(width=1)
e.grid()
e.bind("<KeyPress>",vf)
entrylist+=[e]
root.mainloop()
1 个回答
2
你在第四个输入框中输入的内容,只有在事件结束后才会被保存。也就是说,等到调用 vf(event)
完成后,内容才会被存起来。
我添加了一个按钮,按下后可以显示所有输入框中的内容。这个按钮会显示四个输入框的内容。
如果不这样做,你需要等到调用 vk
完成后,才能访问输入框中的内容。
import Tkinter as tk
def vf(event):
actual = entrylist.index(root.focus_get())
print "--", len(entrylist), actual
if event.char.upper() in ('V', 'F', ' '):
print event.char
if actual < len(entrylist) - 1:
entrylist[actual + 1].focus_set()
else:
#set focus to another widget?
for x in entrylist:
print "-", x.get(), "-"
#the last character is lost!
def show():
for x in entrylist:
print '-', x.get(), '-'
root = tk.Tk()
entrylist = []
for i in xrange(4):
e = tk.Entry(root, width=10)
e.grid()
e.bind("<KeyPress>", vf)
entrylist.append(e)
b = tk.Button(root, text='show', command=show)
b.grid()
root.mainloop()
编辑
在评论中回答这个问题。
看起来,文本只有在释放按键后才会被存储到输入框中。因此,你可以在第四个输入框中检查按键释放事件。到那个时候,你就可以访问所有四个输入框中存储的值了。下面的代码可以实现这个功能(不过我觉得这并不是很优雅,可能还有更简单的方法)。
import Tkinter as tk
def vf(event):
entry_index = entries.index(root.focus_get())
if event.char.upper() in ('V', 'F', ' '):
if entry_index < len(entries) - 1:
entries[entry_index + 1].focus_set()
elif event.keysym not in ('Alt_r', 'Alt_L', 'F4'):
print event.keysym
return 'break'
def show(event):
if entries[-1].get():
# only print the values if the last Entry contains text
for i, e in enumerate(entries):
print 'var %s: %s' % (i, e.get())
root = tk.Tk()
entries = []
for i in xrange(4):
e = tk.Entry(width=10)
e.grid()
e.bind("<KeyPress>", vf)
if i == 3:
# catch KeyRelease events on the last Entry widget
e.bind("<KeyRelease>", show)
entries.append(e)
root.mainloop()