Исправлено _tkinter.TclError: в привязке не указаны события - PullRequest
0 голосов
/ 25 февраля 2020

Получил этот код откуда-то онлайн. Я посмотрел на другой SO ответ, но он не работал для меня. Что я должен исправить эту ошибку Вопрос: Как исправить "- _tkinter.TclError: нет событий, указанных в привязке"

import tkinter as tk

fields = ['Email', 'Password', 'School']

def fetch(entries):
    for entry in entries:
        field = entry[0]
        text  = entry[1].get()
        print('%s: "%s"' % (field, text)) 

def makeform(root, fields):
    entries = []
    for field in fields:
        row = tk.Frame(root)
        lab = tk.Label(row, width=15, text=field, anchor='w')
        ent = tk.Entry(row)
        row.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
        lab.pack(side=tk.LEFT)
        ent.pack(side=tk.RIGHT, expand=tk.YES, fill=tk.X)
        entries.append((field, ent))
    return entries

def getCreds():
    root = tk.Tk()
    ents = makeform(root, fields)
    root.bind('', (lambda events=ents: fetch(e)))   
    b1 = tk.Button(root, text='Show',
                  command=(lambda events=ents: fetch(e)))
    b1.pack(side=tk.LEFT, padx=5, pady=5)
    b2 = tk.Button(root, text='Quit', command=root.quit)
    b2.pack(side=tk.LEFT, padx=5, pady=5)
    root.mainloop()

getCreds()

1 Ответ

1 голос
/ 25 февраля 2020

_tkinter.TclError: нет событий, указанных в привязке

Это должно быть относительно очевидно. Если вы посмотрите на любой из множества примеров bind() в SO или Google, вы обнаружите, что в первом аргументе всегда есть что-то, определяющее c, и никогда не бывает пустой строки.

Найдите время, чтобы читать о tkinter-events-and-bindings .

С вами 2 проблемы root.bind() 1-й, каждый раз, когда вы нажимаете в любом месте экрана, он вызывает функцию. Скорее всего, это не то, что вам нужно.

Вторая проблема, связанная как с привязкой, так и с командой кнопки, заключается в вашей лямбде. events=ents: fetch(e) вы определяете свой список записей как events, но затем передаете e в функцию. Поэтому вы должны исправить это.

Лично я бы создал список в том же месте, где вы определяете root, а также определяете root в глобальном пространстве имен. Это также позволит нам избежать лямбды.

import tkinter as tk

fields = ['Email', 'Password', 'School']


def fetch(_=None):
    for ndex, entry in enumerate(entries):
        print('{}: {}'.format(fields[ndex], entry.get()))


root = tk.Tk()
root.config(background='gray')
entries = []
for ndex, field in enumerate(fields):
    tk.Label(root, width=15, text=field, anchor='w').grid(row=ndex, column=0, sticky='ew')
    entries.append(tk.Entry(root))
    entries[-1].grid(row=ndex, column=1, sticky='ew')

# The problem with root.bind is that it will constantly be calling the function anywhere you click on root.
root.bind('<Button-1>', fetch)
tk.Button(root, text='Show', command=fetch).grid(row=len(fields)+1, column=1, sticky='ew')
tk.Button(root, text='Quit', command=root.quit).grid(row=len(fields)+2, column=1, sticky='ew')
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...