Следующий код объединяет некоторые идеи для интерактивных кнопок в ячейке сетки:
- обратные вызовы
<Enter>
и <Leave>
для наведения мыши - размер кнопки, указанный в пикселях как предложено Брайаном Окли (здесь: { ссылка })
- с использованием padx / pady и width / height для управления пространством, зарезервированным для кнопки
root.after(milliseconds, function)
, как предложено в furas комментарий
import tkinter as tk
buttonsize = [120, 50]
extrasize = [10, 10]
framepad = [6, 6]
anim_time = 40
anim_steps = 10
root = tk.Tk()
pixel = tk.PhotoImage(width=1, height=1)
def SizeChange(event, fraction):
event.widget.grid_configure(padx=(1.0-fraction)*extrasize[0], pady=(1.0-fraction)*extrasize[1])
event.widget.configure(width=buttonsize[0]+2*fraction*extrasize[0],
height=buttonsize[1]+2*fraction*extrasize[1])
root.update_idletasks()
def Highlight(event):
for idx in range(anim_steps):
fraction = float(idx+1)/anim_steps
root.after(int(fraction*anim_time), SizeChange(event, fraction))
def Unhighlight(event):
for idx in range(anim_steps):
fraction = 1.0 - float(idx+1)/anim_steps
root.after(int(fraction*anim_time), SizeChange(event, fraction))
def AddButton(row, col, name):
tkframe = tk.Frame(root, width=buttonsize[0]+extrasize[0],
height=buttonsize[1]+extrasize[1])
tkframe.grid(row=row, column=col, padx=framepad[0], pady=framepad[1], sticky='nsew')
tkbutton = tk.Button(tkframe, text=name, compound='c', image=pixel,
width=buttonsize[0], height=buttonsize[1])
tkbutton.grid(row=0, column=0, padx=extrasize[0], pady=extrasize[1])
tkbutton.bind('<Enter>', Highlight)
tkbutton.bind('<Leave>', Unhighlight)
for idx in range(4):
AddButton(row=idx//2, col=idx%2, name='Button ' + str(idx))
root.mainloop()
Хотя кажется, что плавность анимации сильно зависит от дополнительного размера, добавляемого к размеру кнопки, и временных шагов.