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次文本。


发布于 2018-12-21 15:29:54
当您绑定到一个Toplevel小部件时,绑定将应用于该小部件及其所有的后代。如果只希望由Toplevel小部件处理事件,常见的解决方案是检查与事件关联的小部件对象。
例如,您可以使用winfo_toplevel()获取与任何给定小部件关联的toplevel小部件,并且只在与事件关联的小部件与与事件关联的toplevel窗口相同的情况下执行操作。
例如:
def save_attr(self, event):
if event.widget == event.widget.winfo_toplevel():
...发生这种情况的原因在于事件的处理方式。当您将事件绑定到小部件时,实际上并不是绑定到小部件。相反,您将绑定到与小部件内部名称相同的绑定标记。在处理事件时,该事件将应用于与小部件关联的每个绑定标记。因此,如果绑定到Toplevel小部件,则实际上是绑定到与小部件同名的标记。
小部件的默认绑定标记集包括小部件,但也包括包含小部件的toplevel窗口。完整的列表是小部件、小部件的类名(例如: Label、Button等)、窗口最近的toplevel祖先的名称以及特殊的字符串"all“。
在<Destroy>上绑定的情况下,当toplevel被销毁时,它也会导致它的所有子级被销毁。例如,如果toplevel中有一个标签,它也将得到<Destroy>事件。由于标签具有与Toplevel小部件相关联的绑定标记,因此除了由Toplevel本身处理之外,还将为标签调用绑定函数。
https://stackoverflow.com/questions/53886754
复制相似问题