AttributeError:事件实例没有属性'delete'

时间:2018-03-28 22:35:55

标签: python tkinter attributes

我正在尝试创建一个程序,它将返回用户的输入,并在按下Return / Enter时清除Entry。运行时,第二种方法(def e_delete(e):)始终提供错误AttributeError: Event instance has no attribute 'delete',如果e更改为self,则不返回任何字符串且不会发生错误。

from Tkinter import *
import os.path
import PIL.Image, PIL.ImageTk
import Tkinter as tk

def on_change(e):
    inp = e.widget.get()
    print inp

root = tk.Tk()

#Makes a canvas for objects
canvas = Canvas(root, height=100, width=400)
#Displays the canvas
canvas.grid(row=3, column=2)

root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=1)

label = Label(root, text="Enter an element or the atomic number from 1 to 118.").grid(row=0, column=2)

e = tk.Entry(root)
e.pack()
e.bind("<Return>", on_change)
e.grid(row=2, column=2)
e.focus()

def e_delete(e):
    e.delete(0, 'end')

e.bind("<Return>", e_delete)

#img = create_image(0, 300, 'ptable.png')

root.mainloop()

1 个答案:

答案 0 :(得分:2)

你这样做:

def entry_delete(e):
    e.delete(0, 'end')

The value that gets passed to a callback for an event binding is an Event object.他们没有delete方法。

你也有一个同名的全局变量这一事实没有任何区别(除了让你和其他读者感到困惑);参数e隐藏了全局e

因此,如果您想在Entry对象上调用方法,请不要隐藏它:

def e_delete(evt):
    e.delete(0, 'end')

或者,如果你想在触发事件的任何小部件上调用一个方法(在这种情况下,它将永远是同一个东西,所以这只是一个对你更有意义的问题),你可以做相反:

def e_delete(evt):
    evt.widget.delete(0, 'end')

然而,通常更好的是给所有明确且不同的名称以避免这种混淆:

entry = tk.Entry(root)
ent.pack()
entry.bind("<Return>", on_change)
entry.grid(row=2, column=2)
entry.focus()0

def entry_delete(evt):
    entry.delete(0, 'end')

entry.bind("<Return>", entry_delete)