Можно ли анимировать кадры, которые выложены с помощью менеджера сетки в tkinter? - PullRequest
0 голосов
/ 08 апреля 2020

Я сделал это настольное приложение с tkinter и закончил основные функции. Но теперь я хочу, чтобы это выглядело лучше, и даже анимация меню возможна. Дело в том, что кнопки и виджеты, которые я использовал, содержатся в фреймах, и все они были размещены с использованием компоновки сетки manageR. Поэтому мне было интересно, смогу ли я анимировать элементы (в основном кнопки и рамки) w

Например, если я наведу курсор мыши на кнопку, она немного увеличится в размере, но я хочу, конечно, увидеть увеличение этого размера во времени. Или, может быть, когда я нажимаю одну кнопку и мне нужно перейти к новому кадру, тогда старый сдвинется вправо, например

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Это пример использования after для перемещения Frame с Label и Button. Я использовал place(), чтобы использовать относительное положение, поэтому Frame оставляйте окно, даже если вы измените размер окна.

import tkinter as tk

# --- functions ---

def move(steps=10, distance=0.1):
    if steps > 0:
        # get current position
        relx = float(frame.place_info()['relx'])

        # set new position
        frame.place_configure(relx=relx+distance)

        # repeate it after 10ms
        root.after(10, move, steps-1, distance)

def on_click():
    print('on_click')
    # start move
    move(50, 0.02) # 50*0.02 = 1

# --- main --

root = tk.Tk()

frame = tk.Frame(root, background='red')
frame.place(relx=0, rely=0, relwidth=1, relheight=1)

# to center label and button
#frame.grid_columnconfigure(0, weight=1)
#frame.grid_rowconfigure(0, weight=1)
#frame.grid_rowconfigure(3, weight=1)

label = tk.Label(frame, text='Frame with Label and Button')
label.grid(row=1, column=0)

button = tk.Button(frame, text='MOVE', command=on_click)
button.grid(row=2, column=0)

root.mainloop()
0 голосов
/ 09 апреля 2020

Следующий код объединяет некоторые идеи для интерактивных кнопок в ячейке сетки:

  • обратные вызовы <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()

Хотя кажется, что плавность анимации сильно зависит от дополнительного размера, добавляемого к размеру кнопки, и временных шагов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...