Blog

BLOG

2020.08.24

Python Tkinter のダイアログボックスをカスタマイズしてみた

このエントリーをはてなブックマークに追加

こんにちは、R&Mグループの内田です。

Python でGUIアプリケーションを作るとき、標準ライブラリの Tkinter を使ったりします。
その際、ダイアログボックスのデフォルトの機能のままだとやりたいことができなかったので、ちょっと改造してみました。

例えば、標準のままだとこんな感じのボックスが出力できると思います。

やりたいことは以下です。

  • ラジオボタンなどの部品をウィンドウメッセージ内に配置したい
  • なにかしらのラジオボタンをクリックするまで、OKボタンを押せないようにしたい

以下サイトを参考にします。

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”メソッドあたりをオーバーライドすればいけそうな気がします。

ソースコード:MsgBox.py

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()

実行結果:

ラジオボタンクリック前

ラジオボタンクリック後

OKボタン押下後

# python MsgBox.py
2

※2=Greenの番号

標準ライブラリに関しては、マニュアルや本などで使い方を覚えて流すことが主だったので、きちんとソースコード読むことは大事だなあと思いました。

Python 関連技術記事
一緒に開発しませんか?

サンビット株式会社では、開発技術者を募集しています!
興味のある方はぜひお問い合わせください。

カレンダー

«8月»
      1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31      

最近のエントリー

魅力いっぱいの奄美大島・体験型観光

2026.08.10

マングローブを進むカヤック、島唄と三線に包まれる夕食、夜の森で出会うアマミノクロウサギ。そして、旅の締めくくりには世界にひとつだけのTシャツ作り。奄美大島の自然と文化を全身で味わった、2泊3日の旅の様子をお届けします。次の旅行先を探している方にもおすすめです。

「声なき声」が組織を動かす - CJPデモから考える経営の本質

2026.08.03

社員の不満は、ある日突然生まれるものではありません。小さな違和感や不公平感、「言っても変わらない」という諦めが積み重なり、退職やエンゲージメント低下として表面化します。インドで若者の抗議運動が教育相の辞任につながった出来事から、組織に潜む「声なき声」に耳を傾け、問題の兆しに誠実に向き合う経営のあり方を考えます。

AIエージェント元年、その現状と課題

2026.07.27

各社から相次いで登場している「AIエージェント」。情報収集や資料作成、業務ツールの操作まで任せられるようになった一方、現場では「思ったほど使えていない」という声も聞かれます。各社のAIエージェント機能を紹介するとともに、導入がうまくいかない5つの理由を整理。業務の棚卸しや手順の分解、品質基準の明文化など、小さく試しながら実用化を進める方法を解説しています。

QRコードを使ったフィッシング詐欺が急増【第16回 情報セキュリティブログ】

2026.07.24

QRコードを悪用したフィッシング詐欺「クイッシング」が増加しています。画像内のURLはメールフィルターで検知されにくく、スマートフォンを経由して偽サイトへ誘導される点が特徴です。セキュリティ意識が高い人ほど狙われる巧妙な手口と、被害を防ぐために実践したい3つの確認ポイントをご紹介します。

アーカイブ

ブログ内検索

  1. TOP
  2. BLOG
  3. Python Tkinter のダイアログボックスをカスタマイズしてみた