我有一个n Entry小部件列表。每个小部件只接受一个字符,然后焦点传递给下一个小部件。我想“.get()”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()
答案 0 :(得分:2)
您输入第四个Entry小部件的值仅在事件结束后存储。也就是说,在vf(event)
的呼叫完成后。
我添加了一个按钮,按下该按钮可显示Entry小部件的内容。这将显示所有四个小部件的内容。
否则,在vk
的呼叫完成后,访问Entry小部件的内容。
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()
修改强> 回答评论中的问题。
一旦释放密钥,文本似乎只存储在Entry小部件中。因此,您可以在第四个条目中检查KeyRelease事件。然后,此时,您应该能够访问存储在所有四个小部件中的值。以下作品(但我觉得它不太优雅 - 可能有一种更简单的方法)。
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()