Невозможно использовать изображение кнопки в классе customtkinter фреймаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно использовать изображение кнопки в классе customtkinter фрейма

Сообщение Anonymous »

Я разрабатываю приложение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»