如何获取tkinter Entry小部件列表的最后一个值

时间:2010-08-16 15:45:31

标签: python tkinter

我有一个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()

1 个答案:

答案 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()