次のアプリを作成しました。
起動するとウィンドウが出ます。
ウィンドウのOpenボタンを押すと、ポップアップウィンドウが表示されます。
ポップアップウィンドウにはテキストボックスがあり、Enterボタンを押すとテキストボックスの文字列を控えてポップアップを閉じます。
メインウィンドウのDispボタンを押すと、先程の文字列を表示します。
ソースコード
Python
1from tkinter import ttk 2import tkinter as tk 3 4 5class Main(tk.Tk): 6 def __init__(self): 7 self.str = "" 8 super().__init__() 9 self.geometry("400x300+0+0") 10 self.title("Main") 11 self.view_create() 12 13 def view_create(self): 14 self.button1 = ttk.Button(self, text="Open", command=self.open) 15 self.button1.grid() 16 self.button2 = ttk.Button(self, text="Disp", command=self.disp) 17 self.button2.grid() 18 19 def open(self): 20 self.tl = tk.Toplevel() 21 self.tl.geometry("200x100+0+0") 22 self.tl.title("toplevel") 23 self.tl.attributes("-topmost", True) 24 self.tl.resizable(False, False) 25 self.tl.grab_set() 26 self.tl.transient(self) 27 self.entry = ttk.Entry(self.tl) 28 self.entry.grid() 29 self.entry.insert("end", self.str) 30 self.button3 = ttk.Button(self.tl, text="Enter", command=self.enter) 31 self.button3.grid() 32 self.tl.protocol("WM_DELETE_WINDOW", self.close) 33 34 def disp(self): 35 str = self.str 36 if str != "": 37 print(str) 38 39 def close(self): 40 self.tl.grab_release() 41 self.tl.destroy() 42 43 def enter(self): 44 self.str = self.entry.get() 45 self.close() 46 47def main(): 48 app = Main() 49 app.mainloop() 50 51if __name__ == "__main__": 52 main()
以下質問です。
① 上のコードは、tkinterのイベントコールバック関数を全て インスタンスメソッド(self.***) にしていますが、実際そうしたほうがいいですか?それともインスタンスメソッドの中にメソッドを作るほうがいいですか?
Python
1def pushed(self): 2 def close(tl): 3 tl.destroy() 4 self.tl = tk.Toplevel() 5 self.tl.protocol("WM_DELETE_WINDOW", lambda:close(self.tl))
② 一番上のコードではボタンやエントリにself.をつけていますが、self.をむやみにいろんな変数につけない方が良いとかってありますか?self.を使わず引数で渡す手もありますが、引数の括弧の中がごちゃごちゃしているのって、個人的に見た目汚いようなイメージなので上のコードではself.を使いました。
③ メインウィンドウとポップアップウィンドウを同じクラスの中で処理していますが、実際このままでいいですか?それとも分けたほうがいいですか?
④ 配置するウィジェットが多いとウィジェット配置の記述(上のコードで言うview_create())が膨大になりますが、そういう場合はウィジェットのイベントアクション(上のコードで言うopen()、disp()、close()、enter())は別のクラスやファイルに記述したほうがいいですか?それとも、全部同じファイルまたは同じクラスに記述したほうがいいですか?
回答お願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/11 13:52 編集