Python 如何访问按钮';她父母在特金特没有写作课吗?

Python 如何访问按钮';她父母在特金特没有写作课吗?,python,user-interface,tkinter,event-driven,Python,User Interface,Tkinter,Event Driven,有没有办法找到小部件的父项(特别是按钮),而不将父项保存在对象属性中 but = Button(main_window, text = "close window!") but.bind("<Button-1>", btn_handler) def btn_handler(e): e.parent().destroy() # I need something like this! # e.parent() ==>> main_window # w

有没有办法找到小部件的父项(特别是按钮),而不将父项保存在对象属性中

but = Button(main_window, text = "close window!")
but.bind("<Button-1>", btn_handler)

def btn_handler(e):
    e.parent().destroy() # I need something like this!
    # e.parent() ==>> main_window
    # without writing class and defining self.parent ...
but=按钮(主窗口,text=“关闭窗口!”)
但是.bind(“,btn_处理程序)
def btn_处理器(e):
e、 我需要这样的东西!
#e.parent()==>>主窗口
#没有编写类和定义self.parent。。。

我在internet上搜索了几个小时,没有找到正确的答案。

您可以使用
but.master
访问
but
对象的父对象

要获取处理回调的小部件的容器小部件,可以执行以下操作:

def callback(evt):
    handling_widget = evt.widget
    parent_of_handling_widget = handling_widget.master
    # or evt.widget.master
    parent_of_handling_widget.destroy()
也就是说,我不太清楚为什么要避免使用自定义类。这是解决你问题的自然方法

import tkinter
from tkinter import ttk

class MyButton(ttk.Button):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.configure(command=self.callback)

    def callback(self):
        self.master.destroy()

tk = tkinter.Tk()
b = MyButton(tk, text="close window!")
b.pack()  # or whatever geometry manager you're using

# we're done!

可以使用lambda,也可以使用全局变量。但是类解决方案通常是最好的。@iCodez但是除非我不知道,
命令
回调没有被赋予调用它的事件,所以你没有对函数中正在单击的按钮的引用。(除非您明确地传递它,例如,
but=按钮(main_window,text=“close window!”);but.configure(command=lambda:btn_handler(but))
@ericleveil您能给出关于“lambda”的链接/解释/信息吗?@MiladR
lambda
函数是匿名函数。您需要一个教程,但本质上
foo=lambda num:num*2
def foo(num):return num*2
相同。没有任何理由像我那样命名lambda(通过将其分配给
foo
),但它们适用于回调之类的一次性功能。@AdamSmith-啊,我的错误。我已经见过很多次人们错误地绑定按钮,我认为这只是另一种情况。但在这种情况下,这实际上是必要的。抱歉混淆了。:)e.widget.master可能更符合OP的要求。@Ericleveil啊,没错。我并没有真正将预期用途作为上下文,但应该这样做。我会编辑的。@AdamSmith谢谢!我有一个复杂的问题!我知道一点关于“super”方法的知识,可以用来调用父函数。但我还没有在python中看到“**something”。它是否是某种指针,比如C++指针?这是怎么一回事?它的主题叫什么?@MiladR no,他们完全没有关系。看见