При анимации виджета с помощью after() вместо уменьшения происходит увеличение

У меня возникла проблема с анимацией виджета. У меня есть меню, которое как-бы должно увеличиваться при нажатии на кнопку, и уменьшатся при повторном нажатии. С увеличением всё работает нормально, но с уменьшением происходит какая-то брехня.

import tkinter as tk
from customtkinter import CTkButton

from ui.pages.page import Page
from ui import colors


TOP = 0
BOTTOM = 1


class MenuButton(CTkButton):
    menu_is_opened = False
    width = 51
    buttons = []
    linked_pages: Page = []

    def __init__(self, master, image, linked_page: Page, position = TOP):
        MenuButton.buttons.append(self)
        MenuButton.linked_pages.append(linked_page)
        
        super().__init__(master,
                        width=40,
                        height=40,
                        image=image,
                        text='',
                        fg_color=colors.LEFT_BUTTON,
                        corner_radius=7,
                        command=self.show_linked_page
        )

        self.linked_page = linked_page

        if position == TOP:
            self.top_place()
        elif position == BOTTOM:
            self.bottom_place()

    def show_linked_page(self):
        if self.linked_page == None:
            if not MenuButton.menu_is_opened:
                self.open_menu()
            else:
                self.close_menu()
            return
        
        for page in MenuButton.linked_pages:
            if page == None: continue
            page.grid_forget()
        for button in MenuButton.buttons:
            button.configure(fg_color=colors.LEFT_BUTTON)

        self.linked_page.auto_place()
        self.configure(fg_color=colors.LEFT_BUTTON_ACTIVE)

    def top_place(self):
        self.pack(side=tk.TOP, pady=5, padx=5, anchor=tk.W, fill=tk.Y)

    def bottom_place(self):
        self.pack(side=tk.BOTTOM, pady=5, padx=5, anchor=tk.W, fill=tk.Y)

    def open_menu(self):
        current_width = self.master.winfo_width()
        new_width = current_width + 2

        self.master.configure(width=new_width)

        if new_width >= 203:
            self.master.configure(width=203)
            MenuButton.menu_is_opened = True
            return

        self.after(10, self.open_menu)


    def close_menu(self):
        current_width = self.master.winfo_width()
        print('cur:', current_width)
        new_width = current_width - 2
        print('new:', new_width)

        self.master.configure(width=new_width)

        if new_width <= 51:
            self.master.configure(width=51)
            MenuButton.menu_is_opened = False
            return

        self.after(10, self.close_menu)

Вот код класса MenuButton. Возможно будет трудно разобраться, но уж извините, я только учусь.

Проект на гитхаб https://github.com/KiryxaTechDev/ProductivityMonitoring


Ответы (0 шт):