ryotankの備考録日記

趣味の電子工作についての備考録などなど

減量管理入力補助GUI その18

今回は詰まった問題について

ボタンに画像を埋め込んだ成功例

processing_messa_frame.py

減量管理入力補助GUIの処理メッセージフレームの場合

import tkinter as tk
import sys
import customtkinter as ctk
from PIL import Image
import subprocess


FONT_TYPE = ("meiryo")

ctk.set_appearance_mode("Dark")
ctk.set_default_color_theme("blue")
~~~中略~~~

#処理メッセージフレームクラス
class processing_messageFrame(ctk.CTkFrame):
    def __init__(self, *args, header_name="processing_messageFrame", **kwargs):
        super().__init__(*args, **kwargs)

        self.fonts=(FONT_TYPE, 18)
        self.header_name = header_name

        #フォームのセットアップを実行する
        self.PM_setup_form()

    def PM_setup_form(self): #処理メッセージエリアのセットアップ
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.label_pm = ctk.CTkLabel(self, text=self.header_name, font=(FONT_TYPE, 16)) #エリアのフォントサイズをここで変更する
        self.label_pm.grid(row=0, column=0, padx=10, sticky="w")

        self.textbox_pm = ctk.CTkTextbox(self, width=600, height=300, corner_radius=1, wrap=tk.END, event=read_stream)
        self.textbox_pm.configure(state="disabled", fg_color='pink') #テキストボックスを読み取り専用に設定する
        self.textbox_pm.grid(row=0, column=1, padx=10, pady=10, sticky='w')
        self.textbox_pm.insert("0.0", "処理された事が表示されていきます")
        self.message_textbox= self.textbox_pm.get("0.0", ctk.END) #
        self.textbox_pm.delete("0.0", ctk.END)

        self.png_image=ctk.CTkImage(dark_image=Image.open(R"c:/users/ユーザー名/desktop/作業物/pythonプログラム関連/CustomTkinter関連/減量管理入力補助GUI/ボタン画像/減量管理補助入力GUIのフローチャート-png出力のボタン画像.png"), size=(50, 40))
        self.png_btn = ctk.CTkButton(master=self, 
            text="PNG出力", image=self.png_image, compound='left', command=png_output)
        self.png_btn.grid(row=1, column=0, padx=20)

        
        self.knee_elbow_btn = ctk.CTkButton(master=self, text="ニートゥエルボ説明", command=knee_elbow_win)
        self.knee_elbow_btn.grid(row=2, column=0, padx=20)
        ~~~中略~~~

class Processing_App(ctk.CTk):
    def __init__(self):
        super().__init__()
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.geometry("900x350")
        self.title("処理メッセージフレーム-減量管理入力補助GUI")
        
        self.pro_frame =processing_messageFrame(master=self)
        self.pro_frame.grid(row=0, column=1, padx=20, pady=20, sticky="nsew")

app = Processing_App()
app.mainloop()

にすると画像を埋め込めた

で今回失敗したコードはExercise_count_inputFrame.py

###各運動回数入力する為のフレーム
##作成日:2024-08-10

#残暑バテについてのウィンドウ実装 2024-8-31

from typing import Tuple
import customtkinter as ctk
from PIL import Image

FONT_TYPE = "meiryo"
app = ctk.CTk()

#運動回数入力フレームクラス
class Exercise_count_inputFrame(ctk.CTkFrame):
    def __init__(self, *args, header_name="Exercise_count_inputFrame", **kwargs):
        super().__init__(*args, **kwargs)
        self.fonts = (FONT_TYPE, 18)
        self.header_name = header_name
        
        #フォームのセットアップを実行する
        self.ECI_setup_form()
    
    def ECI_setup_form(self): #運動回数入力エリアのセットアップ
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.label_ECI = ctk.CTkLabel(self, text=self.header_name, 
                                    font=(FONT_TYPE, 16)) #エリアのフォントサイズをここで変更する
        self.label_ECI.grid(row=0, column=0, padx=10, sticky="w")



        self.acclimatization_to_heat_image = ctk.CTkImage(dark_image=Image.open(R"c:/users/rユーザー名/desktop/作業物/pythonプログラム関連/CustomTkinter関連/減量管理入力補助GUI/ボタン画像/減量管理補助入力GUIのフローチャート-暑熱順化のボタン画像.png"), 
                                                    size=(50, 30))
        self.acclimatization_to_heat_image_btn = ctk.CTkButton(master=self, 
                                                            text="暑熱順化(しょねつじゅんか)について", 
                                                            image=self.acclimatization_to_heat_image,
                                                            compound='top')
        self.acclimatization_to_heat_image_btn.grid(row=3, column=0, padx=30)

~~~中略~~~
class Exercise_count_App(ctk.CTk):
        def __init__(self):
            super().__init__()
            self.geometry("500x300")
            self.grid_rowconfigure(0, weight=1)
            self.grid_columnconfigure(0, weight=1)
            self.title("運動回数入力フレーム-減量管理入力補助GUI")

            self.Exe_count_frame = Exercise_count_inputFrame(master=self)
            self.Exe_count_frame.grid(row=0, column=1, padx=30, sticky="nsew")

app=Exercise_count_App()
app.configure(fg_color="pink", width=200, height=100)
#ウィンドウアイコンの設定
#app.iconbitmap(R'C:/users/ryotank-ggh/desktop/作業物/Pythonプログラム関連/CustomTkinter関連/ガントチャートGUI/ウィンドウアイコン関係/make_board_checklist_window.ico')
app.mainloop()

で失敗時に以下のようなエラーメッセージを吐いた


例外が発生しました: TclError image "pyimage1" doesn't exist File "C:\Users\ユーザー名\Desktop\作業物\Pythonプログラム関連\CustomTkinter関連\Exercise_count_input_frame.py", line 170, in ECI_setup_form self.acclimatization_to_heat_image_btn = ctk.CTkButton(master=self, File "C:\Users\ユーザー名\Desktop\作業物\Pythonプログラム関連\CustomTkinter関連\Exercise_count_input_frame.py", line 157, in init self.ECI_setup_form() File "C:\Users\ユーザー名\Desktop\作業物\Pythonプログラム関連\CustomTkinter関連\Exercise_count_input_frame.py", line 212, in init self.Exe_count_frame = Exercise_count_inputFrame(master=self) File "C:\Users\ユーザー名\Desktop\作業物\Pythonプログラム関連\CustomTkinter関連\Exercise_count_input_frame.py", line 215, in app=Exercise_count_App() _tkinter.TclError: image "pyimage1" doesn't exist


パッと見どこがどう違うのかが分からない・・・

コードをフローチャートに戻したら何かわかるかな・・・??

あとpathlibでなるべく可読性を良くしないと見づらいな

うーん、長くかかりそう