首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我将<Destroy>绑定到Toplevel小部件时,bind函数将执行6次

当我将<Destroy>绑定到Toplevel小部件时,bind函数将执行6次
EN

Stack Overflow用户
提问于 2018-12-21 14:50:08
回答 1查看 401关注 0票数 1
代码语言:javascript
复制
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)

如果关闭Toplevel窗口,它将打印6 'run',文本小部件也会插入我输入的6次文本。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-21 15:29:54

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

例如,您可以使用winfo_toplevel()获取与任何给定小部件关联的toplevel小部件,并且只在与事件关联的小部件与与事件关联的toplevel窗口相同的情况下执行操作。

例如:

代码语言:javascript
复制
def save_attr(self, event):
    if event.widget == event.widget.winfo_toplevel():
        ...

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

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

<Destroy>上绑定的情况下,当toplevel被销毁时,它也会导致它的所有子级被销毁。例如,如果toplevel中有一个标签,它也将得到<Destroy>事件。由于标签具有与Toplevel小部件相关联的绑定标记,因此除了由Toplevel本身处理之外,还将为标签调用绑定函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53886754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档