Я работал над своим первым графическим интерфейсом в tkinter - я использую Windows. Моя цель сейчас - иметь кнопки, которые выполняют эти цели:
- Кнопки подсвечиваются при наведении на них.
- Кнопка остается подсвеченной при нажатии.
- Толькоодна кнопка может быть «выбрана» (выделена щелчком мыши) за раз.
Сначала я думал, что достиг этого! Но теперь я понимаю, что моя работа не завершена.
Вот что я вижу:
- Я намыкаю на кнопку A. Она подсвечивается! (ХОРОШО)
- Я нажимаю кнопку А. Она остается выделенной! (ХОРОШО)
- Я наведите курсор мыши на кнопку B. Она подсвечивается! (ХОРОШО)
- Я нажимаю на кнопку B. Она остается выделенной! Основной момент от A удален! (ХОРОШО)
- Я наведите курсор мыши на кнопку А. Она не подсвечивается. (ПЛОХО)
Я вызываю функцию класса default_coloring для кнопки A, когда нажимаю кнопку B. Однако, это, кажется, отключает функции подсветки кнопки A, и кнопка больше не функционирует правильнов соответствии с тремя правилами, которые я перечислил вверху.
Как мне обеспечить, чтобы кнопки продолжали нормально функционировать даже после вызова команды? Неправильно ли я подхожу к этому?
import tkinter as tk
blue = '#0000BB'
white = '#FFFFFF'
class HoverButton(tk.Button):
def __init__(self, master, position = None, **kw):
tk.Button.__init__(self,master=master,**kw)
self.defaultBackground = self["background"]
self.defaultForeground = self["foreground"]
self.bind("<Enter>", self.on_enter)
self.bind("<Leave>", self.on_leave)
self.bind("<Button-1>", self.hover_click)
self.state = 0
self.position = position
def on_enter(self, e):
if self.state == 0:
self['background'] = self['activebackground']
self['foreground'] = self['activeforeground']
def on_leave(self, e):
if self.state == 2:
self.state = 0
if self.state == 0:
self['background'] = self.defaultBackground
self['foreground'] = self.defaultForeground
def hover_click(self, e):
self.state += 1
self.state = self.state % 3
if self.state == 2:
self['background'] = self.defaultBackground
self['foreground'] = self.defaultForeground
def default_coloring(self):
self['background'] = self.defaultBackground
self['foreground'] = self.defaultForeground
class AddOnFrame(tk.Frame):
def __init__(self, master):
self.selectedbutton = None
super().__init__(master)
games = ['A','B','C']
self.objs = list()
self['bg'] = blue
for i in range(3):
self.objs.append(HoverButton(self,position = i, text = games[i].upper(), activebackground = white,activeforeground = blue,fg = white, bg = blue, borderwidth=0, relief = 'flat', highlightbackground = white))
self.objs[i]['command'] = lambda c=i: self._hover_button_clicked(self.objs[c])
self.objs[i].grid(row = i, column = 0, sticky = tk.W + tk.E)
self.blanklabel = tk.Label(self, text = '', background = white)
self.blanklabel.grid(row = 0, column = 1,rowspan = 10, sticky = tk.N + tk.E + tk.W + tk.S)
self.grid_columnconfigure(1, weight=1, minsize=10)
self.grid_columnconfigure(2, weight=1, minsize=500)
self.grid_columnconfigure(3, weight=1, minsize=500)
self.grid_columnconfigure(4, weight=1, minsize=500)
self.pack(expand = True)
def _hover_button_clicked(self, HoverButton):
self.lastbutton = self.selectedbutton
if self.lastbutton != None:
self.objs[self.lastbutton].default_coloring()
self.selectedbutton = HoverButton.position
window = tk.Tk()
window.geometry('1750x950')
window['bg'] = blue
window.title('Testing')
lf = AddOnFrame(window)
lf['bg'] = blue
window.mainloop()