如何获取tkinter Entry组件列表的最后一个值。

0 投票
1 回答
2219 浏览
提问于 2025-04-16 02:51

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

撰写回答