我想知道是否有人可以帮忙。 我有一个带有多个条目小部件的框架。当读取文件时它们会填充数据。 现在我想单击其中之一并按 F8 键清除文本。 我可以长手将 F8 键绑定到每个小部件,但我可以使用 bind_class 或 bind_all 方法来执行此操作吗?
我的微弱尝试如下:
import tkinter
import tkinter as ttk
# from ttkthemes import ThemedTk
class Frame1(ttk.Frame):
def __init__(self, master):
super().__init__(master)
self.bind_class('Entry', '<F8>', self.clearfield)
self.label = ttk.Label(self, text="Name")
self.label2 = ttk.Label(self, text="Contact")
self.name = ttk.Entry(self, width = 30, text="")
self.contact = ttk.Entry(self, width = 20, text="")
self.label.grid(row=1, column=0, padx=10, pady=5, sticky="w")
self.label2.grid(row=2, column=0, padx=10, pady=5, sticky="w")
self.name.grid(row=1, column=1, padx=10, pady=5, sticky="w")
self.contact.grid(row=2, column=1, padx=10, pady=5, sticky="w")
def clearfield(self, event):
insert = self.ttk.Entry.index("insert")
self.ttk.Entry.delete(0, insert)
class App(tkinter.Tk):
def __init__(self):
super().__init__()
# style = ttk.Style(self)
# style.theme_use("alt")
self.title("Test")
self.geometry("250x300")
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(0, weight=1)
self.bind_class('Entry', '<F8>', self.clearfield)
self.acc_no = ttk.Entry(self, width = 60, text="Acc. no.")
self.acc_no.grid(row=0, column=0, padx=10, pady=10, sticky="w")
self.acc_no.focus_set()
self.frame1 = Frame1(self)
self.frame1.grid(row=1, column=0, padx=10, pady=(10, 10), sticky="nsw")
def clearfield(self, event):
insert = self.acc_no.index("insert")
self.acc_no.delete(0, insert)
app=App()
app.mainloop()
互联网上没有任何内容可以解释这一点,我尝试了各种选择但没有成功。
您唯一的错误是尝试在绑定中使用
self
。当调用绑定回调时,会传递一个 event
对象。该对象有一个名为 widget
的属性,它告诉您哪个小部件收到了事件。
下面的例子就说明了这一点。它还消除了计算索引的不必要步骤,而是使用符号索引
"insert"
。
def clearfield(self, event):
event.widget.delete(0, "insert")