В Python 2 (3 имеет другой синтаксис):
Что делать, если вы не можете создать экземпляр родительского класса, прежде чем вам нужно будет вызвать один из его методов?
Используйте super(ChildClass, self).method()
для доступа к родительским методам.
class ParentClass(object):
def method_to_call(self, arg_1):
print arg_1
class ChildClass(ParentClass):
def do_thing(self):
super(ChildClass, self).method_to_call('my arg')
Хотя я думаю, что ответ Брайана проще и полностью решает проблему, вы можете решить проблему «clickability» с привязками (у меня не было второй проблемы, поэтому мой ответ не обратился к ней).
Идея состоит в том, чтобы связать щелчки мыши по кадрам, чтобы вызвать щелчок по кнопке и восстановить обычное поведение кнопки. В моем примере ниже я привязал оба <ButtonPress-1>
и <ButtonRelease-1>
, чтобы увидеть эффекты эффекта кнопки. Я также связал <Enter>
и <Leave>
, чтобы реализовать изменение цвета кнопки, когда мышь над ним.
from Tkinter import *
master = Tk()
buttons = {}
def press(clicked):
print clicked
def frame_enter(redframe, blueframe):
redframe.configure(background='coral1')
blueframe.configure(background='royalblue1')
def frame_leave(redframe, blueframe):
redframe.configure(background='red')
blueframe.configure(background='blue')
def on_press(event, button):
button.event_generate('<ButtonPress-1>', x=event.x, y=event.y)
def on_release(event, button):
button.event_generate('<ButtonRelease-1>', x=event.x, y=event.y)
for i in range(1,7):
button_name = 'button '+str(i)
buttons[i] = Button(master, text=button_name, command=lambda method=button_name:press(method))
buttons[i].grid(row=0, column=i-1, padx=15)
buttons[i].update()
tot_x = buttons[i].winfo_width()
tot_y = buttons[i].winfo_height()
redframe = Frame(buttons[i], width=tot_x/6, background='red')
blueframe = Frame(buttons[i], width=tot_x/6*5, background='blue')
redframe.place(x=0, y=0, relheight=1)
blueframe.place(relx=1./6, y=0, relheight=1)
redframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
blueframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
redframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i]: on_release(e, b))
blueframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i]: on_release(e, b))
redframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
blueframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
redframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
blueframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
master.mainloop()
Изменить: держать кнопки не нужно, их можно заменить кадрами. Таким образом, не нужно использовать place
, цветные кадры можно просто упаковать внутри:
from Tkinter import *
master = Tk()
buttons = {}
def press(clicked):
print clicked
def frame_enter(redframe, blueframe):
redframe.configure(background='coral1')
blueframe.configure(background='royalblue1')
def frame_leave(redframe, blueframe):
redframe.configure(background='red')
blueframe.configure(background='blue')
def on_press(event, widget):
widget.configure(relief='sunken') # mimic button's relief effect on click
def on_release(event, widget, text):
widget.configure(relief='raised') # mimic button's relief effect on click
press(text)
for i in range(1,7):
button_name = 'button '+ str(i)
buttons[i] = Frame(master, relief='raised', width=78, height=24, bd=2)
buttons[i].grid(row=0, column=i-1, padx=15)
buttons[i].update_idletasks()
tot_x = buttons[i].winfo_width()
tot_y = buttons[i].winfo_height()
redframe = Frame(buttons[i], width=tot_x/6, height=tot_y, background='red')
blueframe = Frame(buttons[i], width=tot_x/6*5, height=tot_y, background='blue')
redframe.pack(side='left')
blueframe.pack(side='left')
redframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
blueframe.bind('<ButtonPress-1>', lambda e, b=buttons[i]: on_press(e, b))
redframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i], t=button_name: on_release(e, b, t))
blueframe.bind('<ButtonRelease-1>', lambda e, b=buttons[i], t=button_name: on_release(e, b, t))
redframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
blueframe.bind('<Enter>', lambda e, rf=redframe, bf=blueframe: frame_enter(rf, bf))
redframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))
blueframe.bind('<Leave>', lambda e, rf=redframe, bf=blueframe: frame_leave(rf, bf))