Цвет кнопки Tkinter в нескольких цветах

В 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')
3
задан DoctorEvil 13 July 2018 в 15:02
поделиться

2 ответа

3
ответ дан Bryan Oakley 17 August 2018 в 12:32
поделиться

Хотя я думаю, что ответ Брайана проще и полностью решает проблему, вы можете решить проблему «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)) 
1
ответ дан j_4321 17 August 2018 в 12:32
поделиться
  • 1
    Что-то вроде этого можно было бы использовать для создания интерактивных кадров без использования кнопок, верно? Это тоже может работать для меня. Потому что для меня цветные кадры с вашим кодом исчезают, когда курсор находится вдали от них после первого щелчка и снова появляется, когда курсор находится на них. – DoctorEvil 13 July 2018 в 16:29
  • 2
    @DoctorEvil Да, конечно, это возможно, см. Мое редактирование – j_4321 16 July 2018 в 07:44
Другие вопросы по тегам:

Похожие вопросы: