Использование операторов if с событиями tkinter

#python #if-statement #tkinter #events

#python #if-оператор #tkinter #Мероприятия

Вопрос:

Я пытаюсь создать единую функцию, которая будет реагировать по-разному в зависимости от события, которое ее вызвало. Итак, у меня очень простой пользовательский интерфейс, в котором я удалил исходную строку заголовка и создал свою собственную. Я поставил кнопку закрытия и кнопку сворачивания. Я использую события and для запуска метода, который изменяет цвет фона кнопки закрытия. Мне было интересно, могу ли я использовать тот же метод с оператором if, чтобы изменить цвет фона другой кнопки или единственный способ (может быть, даже лучший?) было бы создать для этого другой метод.

Мой код:

 from tkinter import *
from tkinter import ttk
import os


# --- main ---

root = Tk()

# --- variables ---

bg  = '#2c2c2c'
width = 800
height = 500

# --- classes ---

class AvatarLoader:

    def __init__(self, main):
        self.main = main
        root.title("Avatar Loader")
        self.main.overrideredirect(True)
        self.main.geometry(f'{width}x{height} 400 200')
        self.main.resizable(width=True, height=True)

        self.title_bar = Frame(root, bg=bg, relief = 'raised', bd=1, highlightcolor = bg,             
                               highlightthickness=0, cursor = 'fleur')
        self.title_bar.pack(fill=X)

        self.title_name = Label(self.title_bar, text='Avatar Loader', bg=bg, fg='white')
        self.title_name.pack(side=LEFT)

        self.close_button = Button(self.title_bar, text='X', font=("Calibri",10,"bold"), 
                                   command=root.destroy,bg=bg, padx=4, pady=2, 
                                   activebackground="red", bd=0, fg='white', 
                                   activeforeground="white", highlightthickness=0,
                                   cursor="arrow", height=1)

        self.close_button.pack(side=RIGHT)
        self.close_button.bind('<Enter>', self.change_on_hovering)
        self.close_button.bind('<Leave>', self.return_to_normal_state)

        self.minmax_button = Button(self.title_bar, text="_", font=("Calibri",10,"bold"), 
                                    command=minimize, bg=bg, padx=4, pady=2, 
                                    activebackground="#353535", bd=0, fg='white',
                                    activeforeground="white", highlightthickness=0,
                                    cursor="arrow", height=1)
        self.minmax_button.pack(side=RIGHT)
        self.minmax_button.bind('<Enter>', self.change_on_hovering)
        self.minmax_button.bind('<Leave>', self.return_to_normal_state)

        self.window = Canvas(root, bg=bg, highlightthickness=0, width=width, height=486)
        self.window.pack(expand=1,fill=BOTH)
        self.tab_open = Button(self.window, text='Open', bg="#eabb2d", fg='black', width=2,
                               height=1, padx=20, cursor="arrow", command=open_tab)
        self.tab_open.place(anchor=W, rely=0.5)

    def get_pos(event):

        global xwin
        global ywin

        xwin = event.x
        ywin = event.y

    def move_window(event):
        root.geometry(f" {event.x_root - xwin} {event.y_root - ywin}")

    def change_on_hovering(self, event):
        self.close_button['bg'] = 'red'

    def return_to_normal_state(self, event):
        self.close_button['bg'] = bg

    # --- variables ---

    mode_b = 1
    add_open = 0


# --- functions ---

def open_tab():
    pass

def minimize():
    pass


av = AvatarLoader(root)
av.title_bar.bind('<B1-Motion>', AvatarLoader.move_window)
av.title_bar.bind('<Button-1>', AvatarLoader.get_pos)
av.title_name.bind('<B1-Motion>', AvatarLoader.move_window)
av.title_name.bind('<Button-1>', AvatarLoader.get_pos)

root.mainloop()
 

Итак, рассматриваемый метод — «change_on_hovering», где я хотел бы сказать что-то вроде:
«если self.minmax_button.bind(«, self.change_on_hovering) был триггером: затем измените close_button[bg], иначе: измените minmax_button [bg]

Обновить:

Я попробовал это:

 self.minmax_button.bind('<Enter>', self.change_on_hovering)
self.close_button.bind('<Enter>', self.change_on_hovering)

def change_on_hovering(self, event):
    if self.close_button.bind('<Enter>', self.change_on_hovering):
        self.close_button['bg'] = 'red'
    else:
        self.minmax_button['bg'] = '#303030'
 

В результате при вводе мыши на любую из этих кнопок кнопка закрытия bg стала «красной»

Ответ №1:

event.widget это виджет, который запускает событие, поэтому используйте event.widget["bg"] = ... внутри двух функций.

 def change_on_hovering(self, event):
    event.widget['bg'] = 'red'

def return_to_normal_state(self, event):
    event.widget['bg'] = bg
 

Комментарии:

1. Я не уверен, как это должно произойти. Можете ли вы привести мне пример?

2. @AleksK. Ответ обновлен примером кода.

3. Не удается заставить его работать. В вашем примере нет оператора «if». Я обновил вопрос, добавив то, что я пробовал, но это не сработало. Возможно, это может служить примером того, что именно я пытаюсь сделать.

4. if нет необходимости использовать предложенное мной решение. Я протестировал, и это работает для меня.