#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
нет необходимости использовать предложенное мной решение. Я протестировал, и это работает для меня.