Tkinter。如何将bind_class方法用于多个条目小部件

问题描述 投票:0回答:1

我想知道是否有人可以帮忙。 我有一个带有多个条目小部件的框架。当读取文件时它们会填充数据。 现在我想单击其中之一并按 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()

互联网上没有任何内容可以解释这一点,我尝试了各种选择但没有成功。

tkinter widget bind keypress
1个回答
0
投票

您唯一的错误是尝试在绑定中使用

self
。当调用绑定回调时,会传递一个
event
对象。该对象有一个名为
widget
的属性,它告诉您哪个小部件收到了事件。

下面的例子就说明了这一点。它还消除了计算索引的不必要步骤,而是使用符号索引

"insert"

def clearfield(self, event):
    event.widget.delete(0, "insert")
© www.soinside.com 2019 - 2024. All rights reserved.