Anonymous
Невозможно использовать изображение кнопки в классе customtkinter фрейма
Сообщение
Anonymous » 08 ноя 2024, 05:32
Я разрабатываю приложение customtkinter. В моем приложении, когда я пытаюсь использовать CtkImages в кнопке, я получаю исключение:
Код: Выделить всё
File "c:\Users\user\Desktop\app\app\__main__.py", line 33, in __init__
self.sidebar_frame = SideBarFrame(self)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "c:\Users\user\Desktop\app\app\frames\sidebar.py", line 34, in __init__
self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=ctk.CTkImage(Image.open("assets/add-dark.png")), command=self.show_settings_frame, fg_color="transparent", border_width=0)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\Desktop\app\.venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 106, in __init__
self._draw()
File "C:\Users\user\Desktop\app\.venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 264, in _draw
self._update_image() # set image
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\Desktop\app\.venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 173, in _update_image
self._image_label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(),
File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1721, in configure
return self._configure('configure', cnf, kw)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1711, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist
Мой объектно-ориентированный код:
Код: Выделить всё
class SideBarFrame(ctk.CTkFrame):
def __init__(self, master, **kwargs) -> None:
super().__init__(master, **kwargs)
self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=settings_icon,
command=self.show_settings_frame, fg_color="transparent", border_width=0)
...
Функция для CTkImage:
Код: Выделить всё
import os
def load_icon(self, path, path_for_dark: str | None = None) -> ctk.CTkImage:
light_image, dark_image = Image.open(path), None
print(os.path.exists(path))
if path_for_dark:
dark_image = Image.open(path_for_dark)
return ctk.CTkImage(light_image, dark_image, size=(30, 30))
- всегда возвращает True
Однако в стандартном коде, когда я пишу не объектно-ориентированный код, код стабильно работает, вот так:
Код: Выделить всё
sidebar = ctk.CTkFrame(app, corner_radius=0)
sidebar.grid(row=0, column=0, sticky="ns")
icon1 = load_icon("assets/settings1-dark.png", "assets/settings1.png")
button1 = ctk.CTkButton(sidebar, hover=False, width=50, text="", image=icon1, , fg_color="transparent", hover_color="lightgray", border_width=0)
Та же функция load_icon, тот же каталог, те же параметры и т. д.
Кроме того, я пытался сразу использовать CTkImage как аргумент изображения :
Код: Выделить всё
self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=ctk.CTkImage(Image.open("assets/add-dark.png")), command=self.show_settings_frame, fg_color="transparent", border_width=0)
Это не работает.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... nter-class
1731033163
Anonymous
Я разрабатываю приложение customtkinter. В моем приложении, когда я пытаюсь использовать CtkImages в кнопке, я получаю исключение: [code] File "c:\Users\user\Desktop\app\app\__main__.py", line 33, in __init__ self.sidebar_frame = SideBarFrame(self) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "c:\Users\user\Desktop\app\app\frames\sidebar.py", line 34, in __init__ self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=ctk.CTkImage(Image.open("assets/add-dark.png")), command=self.show_settings_frame, fg_color="transparent", border_width=0) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\Desktop\app\.venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 106, in __init__ self._draw() File "C:\Users\user\Desktop\app\.venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 264, in _draw self._update_image() # set image ^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\Desktop\app\.venv\Lib\site-packages\customtkinter\windows\widgets\ctk_button.py", line 173, in _update_image self._image_label.configure(image=self._image.create_scaled_photo_image(self._get_widget_scaling(), File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1721, in configure return self._configure('configure', cnf, kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\user\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 1711, in _configure self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) _tkinter.TclError: image "pyimage1" doesn't exist [/code] Мой объектно-ориентированный код: [code]class SideBarFrame(ctk.CTkFrame): def __init__(self, master, **kwargs) -> None: super().__init__(master, **kwargs) self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=settings_icon, command=self.show_settings_frame, fg_color="transparent", border_width=0) ... [/code] Функция для CTkImage: [code]import os def load_icon(self, path, path_for_dark: str | None = None) -> ctk.CTkImage: light_image, dark_image = Image.open(path), None print(os.path.exists(path)) if path_for_dark: dark_image = Image.open(path_for_dark) return ctk.CTkImage(light_image, dark_image, size=(30, 30)) [/code] [code]print(os.path.exists(path))[/code] - всегда возвращает True Однако в стандартном коде, когда я пишу не объектно-ориентированный код, код стабильно работает, вот так: [code]sidebar = ctk.CTkFrame(app, corner_radius=0) sidebar.grid(row=0, column=0, sticky="ns") icon1 = load_icon("assets/settings1-dark.png", "assets/settings1.png") button1 = ctk.CTkButton(sidebar, hover=False, width=50, text="", image=icon1, , fg_color="transparent", hover_color="lightgray", border_width=0) [/code] Та же функция load_icon, тот же каталог, те же параметры и т. д. Кроме того, я пытался сразу использовать CTkImage как аргумент изображения : [code]self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=ctk.CTkImage(Image.open("assets/add-dark.png")), command=self.show_settings_frame, fg_color="transparent", border_width=0) [/code] Это не работает. Подробнее здесь: [url]https://stackoverflow.com/questions/79168612/cannot-use-button-image-in-frame-customtkinter-class[/url]