2020.08.24
こんにちは、R&Mグループの内田です。
Python でGUIアプリケーションを作るとき、標準ライブラリの Tkinter を使ったりします。
その際、ダイアログボックスのデフォルトの機能のままだとやりたいことができなかったので、ちょっと改造してみました。
例えば、標準のままだとこんな感じのボックスが出力できると思います。

やりたいことは以下です。
以下サイトを参考にします。
https://effbot.org/tkinterbook/tkinter-dialog-windows.htm
※作業環境…Python 3.7.7使用
Tkinter のライブラリのソースコードを見てみると
simpledialog.py の中の、 Dialog クラスが、カスタマイズ用のベースとして使用できるようなっているようです。
https://github.com/python/cpython/blob/3.7/Lib/tkinter/simpledialog.py
Dialog クラスを継承して新しいクラスを作り、ダイアログボックスの表示を構成している”body”メソッドと、OKやキャンセルボタンを配置している”buttonbox”メソッドあたりをオーバーライドすればいけそうな気がします。
import tkinter as tk
from tkinter import simpledialog
class MyDialog(simpledialog.Dialog):
def body(self, master):
'''ダイアログボックスの表示
どのラジオボタンがクリックされたかself.varに格納(Red=1,Green=2,Blue=3)
ラジオボタンをクリックした際にはswitchButtonStateメソッドでOKボタンをenableにする
'''
self.var = tk.IntVar()
rdo1 = tk.Radiobutton(master, value=1, variable=self.var, command=self.switchButtonState, text='Red').pack(side=tk.LEFT, padx=5, pady=5)
rdo2 = tk.Radiobutton(master, value=2, variable=self.var, command=self.switchButtonState, text='Green').pack(side=tk.LEFT, padx=5, pady=5)
rdo3 = tk.Radiobutton(master, value=3, variable=self.var, command=self.switchButtonState, text='Blue').pack(side=tk.LEFT, padx=5, pady=5)
def buttonbox(self):
'''OK,キャンセルボタンの配置
OKボタンはデフォルトではdisableにしておく
'''
box = tk.Frame(self)
self.button1 = tk.Button(box, text="OK", width=10, command=self.ok, state=tk.DISABLED)
self.button1.pack(side=tk.LEFT, padx=5, pady=5)
self.button2 = tk.Button(box, text="Cancel", width=10, command=self.cancel)
self.button2.pack(side=tk.LEFT, padx=5, pady=5)
box.pack()
def switchButtonState(self):
# ボタンの有効化
if self.button1['state'] == tk.DISABLED:
self.button1['state'] = tk.NORMAL
def apply(self):
# ダイアログボックスを閉じた後にラジオボタン選択結果出力
print(self.var.get())
def test():
root = tk.Tk()
def doit(root=root):
d = MyDialog(root)
t = tk.Button(root, text='Test', command=doit)
t.pack()
q = tk.Button(root, text='Quit', command=t.quit)
q.pack()
t.mainloop()
test()


# python MsgBox.py
2
※2=Greenの番号
標準ライブラリに関しては、マニュアルや本などで使い方を覚えて流すことが主だったので、きちんとソースコード読むことは大事だなあと思いました。
サンビット株式会社では、開発技術者を募集しています!
興味のある方はぜひお問い合わせください。

2026.02.02
年末年始に読了した「世界秩序が変わるとき」を通じ、新自由主義の終焉と国家主導・地政学重視の新たな世界秩序への転換を考察します。覇権国家アメリカの立場を踏まえつつ、日本が「失われた30年」で培った現場力や組織力が、いま再評価される可能性に着目。世界のパラダイムシフトを前向きに捉え、日本の未来に希望を見いだす内容です。
2026.01.26
10年使った炊飯器が大きな故障はないものの、水漏れや炊き上がりの変化などから寿命を意識し、買い替えを検討。ネット検索では情報過多に戸惑い、家電量販店で最新事情を確認する流れを選びました。メーカーは保温性能と使い慣れた考え方を重視し、象印マホービンを継続候補に。価格帯や世代差、型落ち上位モデルの魅力を整理し、価格推移を見ながら最適な購入タイミングを探っています。
2026.01.23
ダッシュボードの目標管理を、もっと効率的に行いたい方におすすめの記事です。Salesforceの「動的ゲージグラフ」は、ユーザーやレコードの項目を目標値として参照できるため、複数のダッシュボードで同じ目標を使っている場合でも、元データを一か所更新するだけで反映される点が特長です。具体的な仕組みから具体的な作成手順、活用時のポイントまでを分かりやすく解説しています。KPI管理や目標達成率の可視化に役立つ内容となっております。
2026.01.19
疲れたときは「寝る」だけで十分だと思っていませんか?本記事では、科学的な視点から休養を7つのタイプに分類し、運動や人との交流、環境の変化など、行動することで回復につながる方法を紹介しています。自分に合った休養の取り方を知り、日々の疲労と上手に付き合うためのヒントをお届けします。