当我将<Destroy>绑定到顶级小部件时,bind函数将比on执行6倍

2024-04-16 09:54:51 发布

您现在位置:Python中文网/ 问答频道 /正文

class Attribute:
    def __init__(self, pos_x, pos_y):
        self.attr_top = Toplevel()
        print(root.winfo_x() + pos_x)
        self.attr_top.geometry('+' + str(root.winfo_x() + pos_x) + '+' + str(root.winfo_y() + pos_y))
        self.name_var = StringVar()
        self.name_var.set('name')
        self.name_label = Label(self.attr_top, textvariable = self.name_var)
        self.name_label.grid(row = 0, column = 0)
        self.name_enter = Entry(self.attr_top)
        self.name_enter.grid(row = 0, column = 1)
        self.next_name_var = StringVar()
        self.next_name_var.set('link')
        self.next_name_label = Label(self.attr_top, textvariable = self.next_name_var)
        self.next_name_label.grid(row = 1, column = 0)
        self.next_name_enter = Entry(self.attr_top)

        self.finish_button = Button(self.attr_top, text = 'finsh edit', command = self.button_close_top)
        self.finish_button.grid(row = 3, column = 0, columnspan = 2)
        self.attr_top.bind('<Return>', self.return_close_top)
        self.next_name_enter.grid(row = 1, column = 1)

    def button_close_top(self):
        self.name = self.name_enter.get()
        self.next_name = self.next_name_enter.get()
        self.attr_top.destroy()

    def return_close_top(self, event):
        self.button_close_top()

    def save_attr(self, event):
        name = self.attr.name
        next_name = self.attr.next_name

        print('jinru')
        name_font = tkfont.Font(size = 10)
        self.enter_text.insert(END, name)
        self.enter_text.tag_add(name, 1.0, END)
        self.enter_text.tag_config(name, font = name_font, offset = 2, underline = 1)

    def edit_brief(self):
        print('edit brief')
        self.attr = Attribute(self.widget_pos_x, self.widget_pos_y)
        self.enter_text = Text(self.window_frame, width = 30, height = 3)
        self.enter_text.place(x = self.widget_pos_x, y = self.widget_pos_y)
        self.attr.attr_top.bind('<Destroy>', self.save_attr)

如果我关闭顶层窗口,它将打印6个“run”,文本小部件还将插入我输入的6倍文本。 enter image description hereenter image description here


Tags: textnameposselfclosevartopdef
0条回答
网友
1楼 · 发布于 2024-04-16 09:54:51

当您绑定到Toplevel小部件时,绑定将应用于该小部件及其所有子部件。如果您只希望事件由Toplevel小部件处理,那么常见的解决方案是检查与事件关联的小部件对象。你知道吗

例如,可以使用winfo_toplevel()获取与任何给定小部件关联的顶级小部件,并且仅当与事件关联的小部件与与与事件关联的顶级窗口相同时才执行操作。你知道吗

例如:

def save_attr(self, event):
    if event.widget == event.widget.winfo_toplevel():
        ...

发生这种情况的原因在于事件的处理方式。将事件绑定到小部件时,实际上并没有绑定到小部件。相反,您将绑定到一个绑定标签,该标签的名称与小部件的内部名称相同。处理事件时,事件将应用于与小部件关联的每个绑定标记。因此,如果您绑定到一个Toplevel小部件,您实际上是绑定到一个与小部件同名的标记。你知道吗

小部件的默认绑定标记集包括小部件,但也包括包含小部件的顶级窗口。完整列表是小部件、小部件的类名(例如:Label、Button等)、窗口最近的顶级祖先的名称以及特殊字符串“all”。你知道吗

对于<Destroy>上的绑定,当顶级被销毁时,它也会导致它的所有子级被销毁。例如,如果顶层中有一个标签,它还将获得<Destroy>事件。由于标签有一个与Toplevel小部件关联的绑定标记,因此除了由Toplevel本身处理外,还将为标签调用绑定函数。你知道吗

相关问题 更多 >