コードの再利用や保守性を気にしない場合は、Toplevel から独自に作ってしまった方が簡単ですが、
カスタマイズ方法について回答します。
simpledialog は Pythonで作成されたモジュールなので、
(ソースコードを読めば) カスタマイズは可能です。
askstring 関数自体のカスタマイズは出来ませんが、
内部で使われている _QueryString や Dialogクラスが利用できます。
カスタムダイアログの実装例:
- simpledialog.Dialog や _QueryString 等を継承したクラスを作り
body や buttonbox メソッド内で任意のウイジェットを生成
- askstring のように、ダイアログから値を返す関数を作る
python
1import tkinter as tk
2from tkinter import simpledialog
3
4class CustomQueryString(simpledialog._QueryString):
5
6 def body(self, master):
7 entry = super().body(master)
8 frame = self.nametowidget("!frame")
9
10 # ダイアログの上部分にウィジェットを追加したい場合
11 # ここで frame を親にウィジェット生成
12
13 # 戻り値は、最初にフォーカスを得るウィジェット
14 return entry
15
16 def buttonbox(self):
17 super().buttonbox()
18 box = self.nametowidget("!frame2")
19
20 # ボタンを追加したい場合
21 button = tk.Button(box, text="Sample", width=10)
22 button.pack(side=tk.LEFT, padx=5, pady=5)
23
24
25def askstring(title, prompt, **kw):
26 d = CustomQueryString(title, prompt, **kw)
27 return d.result
28
29
30if __name__ == '__main__':
31 root = tk.Tk()
32 root.withdraw()
33
34 askstring("title", "prompt")
既存クラスを利用する場合、実装するコードが差分のみで済むのが利点ですが
クラス内部のコードを読み、挙動を把握する必要があります。
ボタンを押したときの挙動、ダイアログの閉じ方、入力値の戻し方、等々が次の課題となるはずです。
messagebox は プラットフォーム側の提供するダイアログを呼び出す機能なので、
基本、あまり高度なカスタマイズは想定されてません。
カスタマイズするにはプラットフォームの提供するAPI等を用いる必要があります。
プラットフォーム毎に方法は異なり、Pythonから操作するには ctypes 等を用います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/26 06:43