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      

最近のエントリー

Autodesk FusionとAI連携(MCP)実現できる設計DXの可能性

2026.05.11

Autodesk FusionがMCP(Model Context Protocol)に対応したことで、生成AIがCADを直接操作できる可能性が広がっています。本記事では、Claude DesktopとFusionを連携し、プロンプトによる3Dモデリングや三面図からの3D化、アセンブリ情報の取得を実際に検証しました。現時点では細かな設計意図の指示が必要な場面もありますが、部品情報の抽出や見積・原価計算の自動化など、設計業務と基幹システムをつなぐ新たなDXの可能性が見えてきました。

春季労使交渉に思う、“ビッグステイ”を選ばれる会社の条件

2026.05.07

春季労使交渉のニュースを見ると、大手企業との賃金差を実感します。今回は、物価上昇率や民間給与実態統計をもとに、当社の平均年収の位置づけを確認しました。転職ではなく、今の会社に留まることを前向きに選ぶ「ビッグステイ」。その選択肢になれる会社であり続けるために、何が必要なのかを考えます。

水木しげるさんの戦記を読む|戦後90年に向けて

2026.04.27

水木しげるさんの戦記や関連著作を5冊読み比べながら、それぞれの本の魅力と心に残った点を紹介します。戦争の過酷さや生き残ったことの重みが描かれる一方で、文章や絵の力によって不思議と「もっと知りたい」と思わされる読書体験が綴られています。戦後90年に向けて、戦争を知らない世代が何を受け取り、どうつないでいくかを考えるきっかけになる内容です。

Salesforce のダッシュボードの機能 〜動的ゲージグラフの数式を使った目標値〜

2026.04.24

Salesforceの動的ゲージグラフにおいて、数式を用いた目標値の設定方法を解説します。年間目標から月次目標を算出する基本的な使い方に加え、役職や勤続年数に応じて目標値を変動させる方法を紹介。IF関数や日付項目を活用することで、複数条件に基づいた柔軟な目標設定が可能になります。さらに、カスタムオブジェクトやフローを組み合わせることで、より高度な管理にも対応できる点についても触れています。

アーカイブ

ブログ内検索

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