
利子計算ツールに再挑戦(4)
前回の
で、Copilot先生は、なにをアドバイスしてくれたのか。
この機会に身につけて今後使えるように、解読してみます。
1.ウィジェット作成を関数化
「見出し」があって、「Entry」の入力があって、「単位」があるパターン。

この赤枠の範囲を自分は
#widgets配置(元金)
self.ctklabel_midashi_gankin = ctk.CTkLabel(self, text="元金")
self.ctklabel_midashi_gankin.grid(row=0, column=0, padx =20, sticky ="ws")
self.ctkentry1_gankin = ctk.CTkEntry(self)
self.ctkentry1_gankin.grid(row=0,column=1,pady =5, sticky ="ws")
self.ctklabel_unit_gankin = ctk.CTkLabel(self, text="円")
self.ctklabel_unit_gankin.grid(row=0, column=2,padx =20, sticky ="ws")
#widgets配置(利率)
self.ctklabe2_midashi_riritsu = ctk.CTkLabel(self, text="利率")
self.ctklabe2_midashi_riritsu.grid(row=1, column=0, padx =20, sticky ="ws")
self.ctkentry_riritsu = ctk.CTkEntry(self)
self.ctkentry_riritsu.grid(row=1, column=1,pady =5, sticky ="ws")
self.ctklabel_unit_riritsu = ctk.CTkLabel(self, text="割/10日")
self.ctklabel_unit_riritsu.grid(row=1, column=2, padx =20, sticky ="ws")
#widgets配置(日数)
self.ctklabel_midasi_nissu = ctk.CTkLabel(self, text="日数")
self.ctklabel_midasi_nissu.grid(row=2, column=0, padx =20, sticky ="ws")
self.ctkentry_nissu = ctk.CTkEntry(self)
self.ctkentry_nissu.grid(row=2, column=1,pady =5, sticky ="ws")
self.ctklabel_unit_nissu = ctk.CTkLabel(self, text="日")
self.ctklabel_unit_nissu.grid(row=2, column=2, padx =20, sticky ="ws")
と、ひたすら「だらだら」羅列していたわけですが、Copilot先生はウィジェット作成を関数化することを提案してくれた。
def create_label_entry_unit(self, label_text, unit_text, row):
ctk.CTkLabel(self, text=label_text).grid(row=row, column=0, **self.grid_params)
entry = ctk.CTkEntry(self)
entry.grid(row=row, column=1, pady=5, sticky="ws")
setattr(self, f'ctkentry_{label_text}', entry)
ctk.CTkLabel(self, text=unit_text).grid(row=row, column=2, padx=20, sticky="ws")
こういう↑関数を定義したうえで、
# ウィジェットの作成
self.create_label_entry_unit("元金", "円", 0)
self.create_label_entry_unit("利率", "割/10日", 1)
self.create_label_entry_unit("日数", "日", 2)
と三行で片付けている。
変数名のいらないウィジェット
まず、ウィジェット全部に変数名を付ける必要はなかったわけですね。
なるほど、ただ書いておくだけのラベル、後で読み取ったり、書き換えたりする必要がない、プログラム実行時に変化が起こらないラベルなら名前を割り当てる必要もない。
変数名が必要なウィジェット
entryに関しては、入力内容を読み取る必要があるので名前が要りますが、ここでsetattr関数を使っている。
setattr(self, f'ctkentry_{label_text}', entry)
これで、「self.ctkentry_(ラベル文字列)」というメンバ変数にentryを入れている。なるほど・・。
もうひとつ目からうろこだったのは、pythonの変数名に「ctkentry_利率」のように全角文字使っていること。これで良かったんですね。
こんなふうに
self.ctkentry_riritsu = ctk.CTkEntry(self)
riritsuなんて書く必要なかったんですね。
2.デフォルトのパラメータの扱い
これも目からうろこ。
# デフォルトのグリッド配置パラメータ
self.grid_params = {'padx': 20, 'pady': 5, 'sticky': 'ws'}
ラベル用のデフォルトパラメータを辞書型で持っておく。そしてラベル生成するときに
ctk.CTkLabel(self, text=label_text).grid(row=row, column=0, **self.grid_params)
おっと**って何? 大昔、挫折したC言語の教科書には、ポインタへのポインタとかあって、ちんぷんかんぷんだったあれか?
Copilot先生に聞けばいい。


キーワード引数を辞書として渡すとな!・・なんと便利な。