Здравствуйте.
При клике по Frame вызывается функция fn(). Можно ли замутить так, чтобы она вызывалась и при клике по объектам, расположенным на этой Frame? Ну кроме того, чтобы вручную прикручивать её к каждому объекту.
def fn(): .... f = Frame() for object in f.winfo_children(): object.bind("<Button-1>", lambda event: fn()) ....
from tkinter import * def fn(event): print("clicked", event) root = Tk() f1 = Frame(root) b1 = Button(f1, text='Button 1') b2 = Button(f1, text='Button 2') t1 = Text(f1) t1.pack() b1.pack() b2.pack() for child in f1.winfo_children(): child.bind("<1>", lambda event: fn(event)) f1.pack() root.mainloop()
def fn(): .... f = Frame() for object in f.winfo_children(): object.bind("<Button-1>", lambda event: fn()) ....
4kpt_IVЦелью моего поста было всего лишь показать работу метода winfo_children(), а не предложение таким образом реализовывать код В первой же строчке моего поста написано про наследование классов вообще-то. Я подразумевал, что и контейнерный класс тоже отнаследован от соответствующего, то есть, как вы и написали, от Frame. Я предположил, что человек просто не знает про существование этого метода, а уж как именно он его задействует, оставил на его усмотрение. Однако, у вас я вижу только общие слова, но нет конкретики - как же именно переопределить метод bind()?
Вот как-раз так ни в коем случае писать нельзя
drevoborod
Однако, у вас я вижу только общие слова, но нет конкретики - как же именно переопределить метод bind()?
child.bind("<1>", lambda event: fn(event))
child.bind("<1>", fn)
import tkinter class MyFrame(tkinter.Frame): def __init__(self, parent=None, **options): tkinter.Frame.__init__(self, master=parent, **options) def bind(self, sequence=None, func=None, add=None): tkinter.Frame.bind_all(self, sequence, func, add) def myfunc(event): print("clicked", event.widget._name) if __name__ == "__main__": root = tkinter.Tk() external_frame = MyFrame(root) tkinter.Button(external_frame, text='External Button 1').pack() tkinter.Button(external_frame, text='External Button 2').pack() internal_frame = tkinter.Frame(external_frame) internal_frame.pack() tkinter.Button(internal_frame, text='Internal button').pack() text1 = tkinter.Text(external_frame) checkbox1 = tkinter.Checkbutton(text="Check me") checkbox2 = tkinter.Checkbutton(text="Check me too") text1.window_create("end", window=checkbox1) text1.insert('end', ' some text ') text1.window_create('end', window=checkbox2) text1.pack() external_frame.bind("<Button-1>", myfunc) external_frame.pack() root.mainloop()
tkinter.Frame.__init__(self, master=parent, **options)
super().__init__(self, master=parent, **options)
class MyFrame(tkinter.Frame): def bind(self, sequence=None, func=None, add=None): for child in self.winfo_children(): child.bind(sequence, func, add) MyFrame.bind(child, sequence, func, add)