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      

最近のエントリー

夜行フェリーから始まった島時間。3度目の五島列島・福江島へ!

2026.11.09

3度訪れても、また行きたくなる五島列島・福江島。初めて訪れたときは、夜行フェリーの窓から夜の海や島々の港を眺め、到着まで胸を弾ませていました。透き通る海と白い砂浜、断崖に立つ灯台、祈りの歴史を伝える教会など、旅の思い出とともに、私がひかれた島の魅力をご紹介します。

日本の生産性を阻む「当たり前」を見直す

2026.11.02

長年続いてきた商習慣や人事制度を、「当たり前」と受け入れていないでしょうか。今回は、IT業界の多重下請け構造と役職定年制度について考えます。技術者を育て、顧客に提供する価値を高めること。当社の取り組みも交えながら、中小企業が生産性向上と賃上げを両立するために、見直すべき課題をお伝えします。

独自の音声入力アプリを作成してみた

2026.10.26

便利な音声入力アプリを、社内のみんなにも使ってほしい。でも、全社員分の利用料を考えると導入をためらってしまう――。そんな課題をきっかけに、AIエージェントを使って独自のアプリを作ってみました。いきなりコードを書かせず、まずは課題と設計を整理することからスタート。実装やテスト、不具合の修正を経て、1日である程度使える形になるまでの進め方を紹介します。「作るか、買うか」を考えるヒントになる開発体験記です。

門司港で南極観測船「しらせ」を見学してきました

2026.10.19

南極へ向かう船の中は、どうなっているのでしょうか?14年ぶりに門司港へ寄港した南極観測船「しらせ」の一般公開に行ってきました。間近で見る全長138mの船体の迫力や、甲板・艦橋などの見学を通して、遠い南極での活動がぐっと身近に。街では南極の氷や石の展示、しらせのレシピを使ったカレーも楽しめるなど、寄港を歓迎する催しが行われました。見学で印象に残ったことや、周辺イベントの様子をご紹介します。

アーカイブ

ブログ内検索

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