質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1674閲覧

python simpledialog ボタン追加 方法

naisu

総合スコア6

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/05/25 07:24

python tkinter.simpledialog
で、

python

1simpledialog.askstring("Input Box", "値を入力してください",)

で、値を入力できるメッセージボックスができのですが、
それをテキストボックスではなく、ボタンを追加したいのですが、やり方がわからないです。
tkinterのウィンドウとして作るしかないのでしょうか、ご回答お願いします。

試したこと

python

1simpledialog.askstring("Input Button", "ボタンです,)

や、

python

1simpledialog.askstring("Button", "値を入力してください",)

など、、、
ちなみにボタンはこのリンクを参考にしてみました
messageboxとsimpledialogのまとめ

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コードの再利用や保守性を気にしない場合は、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/25 08:51

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naisu

2022/05/26 06:43

ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問