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.09.24
SalesforceのSpring ’26以降、新規作成が制限される「接続アプリケーション」に代わり、次世代の「外部クライアントアプリケーション」を利用する方法を解説します。クライアントログイン情報フローの設定から、Talend API Testerを使ったアクセストークンの取得、REST APIによるAccount情報の取得まで、実際の手順に沿って紹介します。
2026.09.18
生成AIの進化によって、見破ることが難しくなっている「標的型攻撃メール」。差出人の偽装、緊急性をあおる文面、不審な添付ファイルやURLなど、注意すべき4つの特徴を解説します。さらに、社長になりすましてLINEへ誘導する「CEO詐欺」や、MFAの再設定を装う「QRコード詐欺」といった最新手口を紹介し、迅速に報告できる組織づくりの重要性を伝えます。
2026.09.14
昨年度優勝した相性の良い大会で、今年もA級男子ダブルスの上位進出を目指して熱戦に挑みました。予選で完敗したペアへの雪辱、前回の決勝相手との接戦を経て、結果は見事準優勝。パートナーとの連携が勝敗を左右するダブルスならではの難しさや、決勝で攻略できなかった「カットマン」への新たな闘志をつづります。
2026.09.07
会社が長く存続することは、決して当たり前ではありません。取引先の破産を知った時期に迎えた、親会社・橋口電機の創立80周年。企業寿命30年説や橋口電機が幾度もの経済危機を乗り越えてきた歴史を振り返りながら、堅実な財務基盤と変化への挑戦を両立し、SUNBITが長寿企業として歩み続けるための経営について綴ります。