Форум сайта python.su
Вы запускали Ваш код?
Офлайн
4kpt_IVДа, конечно. А что не так? При клике по любой кнопке или тексту как во внутренней, так и внешней рамках (а я для проверки ещё пару уровней вложенности добавлял) срабатывает забинденная функция myfunc. Но она не срабатывает в двух случаях: при клике в пустое пространство MyFrame, а также при клике на встроенных в Text чекбаттонах. Чтобы исправить первый случай, добавляем в переопределённый bind строчку
Вы запускали Ваш код?
tkinter.Widget.bind(self, sequence, func, add)
super().bind(sequence, func, add)
import tkinter class MyFrame(tkinter.Frame): def __init__(self, parent=None, **options): super().__init__(master=parent, relief='groove', bd=2, **options) def bind(self, sequence=None, func=None, add=None): tkinter.Widget.bind(self, sequence, func, add) for child in self.winfo_children(): MyFrame.bind(child, 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, relief='groove', bd=2) internal_frame.pack() tkinter.Button(internal_frame, text='Internal button Large').pack() tkinter.Button(internal_frame, text='IntButt').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()
Отредактировано drevoborod (Март 11, 2016 07:56:34)
Офлайн
drevoborod
Кстати, у вас в примере про super() ошибка - там не должно быть self, так как “The search order is same as that used by getattr() except that the type itself is skipped.”. В итоге весь код будет выглядеть так (для примера добавим рамке границу, чтобы был какой-то смысл переопределять __init__ суперкласса):
Офлайн
4kpt_IVВ таком случае, предлагаю продемонстрировать верный.
2. Ваш пример неверный.
Отредактировано drevoborod (Март 11, 2016 10:55:10)
Офлайн
drevoborod
Init в данном случае нужен, так как я решил моему Frame добавлять рамочку по умолчанию. Если этого не делать, то не нужен, конечно.
Офлайн