2015-06-20 1 views
1

Есть ли способ найти родителя-виджета (в частности, кнопку) без сохранения родительского элемента в атрибуте объекта?Как получить доступ к родительскому элементу кнопки в Tkinter без написания класса?

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 ... 

Я ищу интернет в течение нескольких часов, и я не нашел правильного ответа.

+1

Вы можете использовать лямбда или использовать глобальные переменные. Но решение класса обычно лучше. –

+0

@iCodez Но если я просто не осведомлен, обратный вызов 'command' не получает событие, которое вызывает его, поэтому у вас нет ссылки на кнопку, которая нажата внутри функции. (Если вы явно не передаете его, например, 'but = Button (main_window, text =" закрыть окно! "); But.configure (command = lambda: btn_handler (but))' –

+0

@EricLevieil, пожалуйста, дайте ссылку/объяснение/что-то о «lambda»? –

ответ

4

Вы можете использовать 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! 
+2

e.widget.master, вероятно, больше того, чего хочет OP. –

+0

@EricLevieil ах, правда. Я не собирался использовать его в качестве контекста, но должен был. Я отредактирую. –

+0

@AdamSmith Спасибо! У меня есть разные вопросы! Я знаю немного о методе «супер», который вы можете использовать для вызова родительской функции. Но я не видел «что-то» в python. Это какой-то указатель, такой как указатели C++? Что это? Как называется его тема? –