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.04.20

春は新生活のスタートとともに、アレルギーに悩まされる方も多い季節です。対処療法で乗り切ってきた中で、睡眠や食事といった基本を見直すことで体調の安定を実感しています。

ラージボール卓球 ~2025年度ラージボール卓球選手権大会(年齢別シングルス)

2026.04.13

2026年2月に開催された佐賀県ラージボール卓球選手権大会に出場し、60~64歳クラスで優勝した体験を振り返ります。予選リーグを順調に勝ち上がり、トーナメントでは日頃から対戦経験のある選手との接戦を制して決勝へ。決勝ではファイナルゲームまでもつれる白熱した試合となり、最後は接戦をものにしました。これまでの経験や戦術の変化を実感しながら、試合ならではの緊張感も味わうことができました。

「未来屋書店」100人の作家が教えてくれる読書の本質について

2026.04.06

未来屋書店の特別企画「作家100」を通じて、読書の本質について考察しました。100人の作家による直筆の言葉からは、本が持つ力や価値が多角的に浮かび上がります。本を読むことの意味をあらためて考えたくなる内容です。

1980年代のとある小学生の遊び

2026.03.30

息子の遊び方と比べながら、私が小学生だった1980年代後半から1990年頃の遊びを振り返りました。缶蹴りやケイドロ、ろくむし、秘密基地づくりなどの外遊びに加え、迷路づくりやミニ四駆、ファミコンといった遊びにも夢中でした。日が暮れるまで友達と遊び、夕方に家へ帰る――そんな懐かしく幸せだった時間を思い出しています。

アーカイブ

ブログ内検索

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