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      

ブログ内検索