Я разрабатываю приложение 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))
print(os.path.exists(path)) - всегда возвращает 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)
Я уже удалил все кадры, все параметры, все элементы из окна для тестирования и получаю такое же исключение. Однако код с кнопками изображений работает только в одном файле. Безумие..
Код с исключением:
sidebar.py
class SideBarFrame(ctk.CTkFrame):
def __init__(self, master, **kwargs) -> None:
super().__init__(master, **kwargs)
self.master = master
self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.get_icon("account"), fg_color="transparent", border_width=0)
self.account_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.get_icon("account"), fg_color="transparent", border_width=0)
self.add_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.get_icon("account"), fg_color="transparent", border_width=0)
self.history_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.get_icon("account"), fg_color="transparent", border_width=0)
self.account_button.grid(row=3, column=0, pady=(10, 20), padx=10)
self.add_button.grid(row=0, column=0, pady=(10, 20), padx=10)
self.history_button.grid(row=1, column=0, pady=(10, 20), padx=10)
self.settings_button.grid(row=4, column=0, pady=(10, 20), padx=10)
self.grid_rowconfigure(0, weight=0)
self.grid_rowconfigure(1, weight=0)
self.grid_rowconfigure(2, weight=1)
self.grid_rowconfigure(3, weight=0)
self.grid_rowconfigure(4, weight=0)
def get_icon(self, what: str) -> ctk.CTkImage:
"""Returns icon image based on description of `what`."""
if what == "account":
dark_path = "assets/account-1-dark.png"
light_path = "assets/account-1.png"
return ctk.CTkImage(open_img(light_path), open_img(dark_path), (20, 20))
main.py
class MainWindow(ctk.CTk):
def __init__(self):
super().__init__()
self.geometry("700x600")
self.sidebar_frame = SideBarFrame(master=self)
self.sidebar_frame.grid(row=0, column=0, sticky="ns")
Например, в этом файле все работает:
import customtkinter as ctk
from PIL import Image
def load_icon(path, path_for_dark: str | None = None) -> ctk.CTkImage:
light_image, dark_image = Image.open(path), None
if path_for_dark:
dark_image = Image.open(path_for_dark)
return ctk.CTkImage(light_image, dark_image, size=(30, 30))
class SideBarFrame(ctk.CTkFrame):
def __init__(self, master, **kwargs) -> None:
super().__init__(master, **kwargs)
self.master = master
self.add_icon = load_icon("assets/add-dark.png", "assets/add.png")
self.history_icon = load_icon("assets/history-dark.png", "assets/history.png")
self.settings_icon = load_icon("assets/settings1-dark.png", "assets/settings1.png")
self.account_icon = load_icon("assets/account-1-dark.png", "assets/account-1.png")
self.settings_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.settings_icon, fg_color="transparent", border_width=0)
self.account_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.account_icon, fg_color="transparent", border_width=0)
self.add_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.add_icon, fg_color="transparent", border_width=0)
self.history_button = ctk.CTkButton(self, hover=False, width=50, text="", image=self.history_icon, fg_color="transparent", border_width=0)
self.account_button.grid(row=3, column=0, pady=(10, 20), padx=10)
self.add_button.grid(row=0, column=0, pady=(10, 20), padx=10)
self.history_button.grid(row=1, column=0, pady=(10, 20), padx=10)
self.settings_button.grid(row=4, column=0, pady=(10, 20), padx=10)
self.grid_rowconfigure(0, weight=0)
self.grid_rowconfigure(1, weight=0)
self.grid_rowconfigure(2, weight=1)
self.grid_rowconfigure(3, weight=0)
self.grid_rowconfigure(4, weight=0)
class AccountFrame(ctk.CTkFrame):
def __init__(self, master: ctk.CTk) -> None:
super().__init__(master)
self.master = master
class Window(ctk.CTk):
def __init__(self):
super().__init__()
account = AccountFrame(self)
account.grid(row=1, column=2)
sidebar = SideBarFrame(self)
sidebar.grid(row=0, column=0)
app = Window()
app.mainloop()
Подробнее здесь: https://stackoverflow.com/questions/791 ... nter-class
Невозможно использовать изображение кнопки в классе customtkinter фрейма ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Невозможно использовать изображение кнопки в классе customtkinter фрейма
Anonymous » » в форуме Python - 0 Ответы
- 15 Просмотры
-
Последнее сообщение Anonymous
-