Как получить последнее значение списка виджетов tkinter Entry - PullRequest
0 голосов
/ 16 августа 2010

У меня есть список из 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 Ответ

2 голосов
/ 16 августа 2010

Значение, которое вы вводите в четвертый виджет «Запись», сохраняется только после завершения события. То есть после завершения звонка на vf(event).

Я добавил кнопку, которая отображает содержимое виджетов ввода при нажатии. Это отобразит содержимое всех четырех виджетов.

В противном случае получить доступ к содержимому виджетов Entry после завершения вызова 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()

Редактировать Отвечая на вопрос в комментарии.

Похоже, что текст сохраняется в виджете ввода только после отпускания ключа. Таким образом, вы можете проверить наличие событий 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...