我正在尝试创建一个程序,它将返回用户的输入,并在按下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()
答案 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)