いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Pythonメモ-39 (メッセージボックス表示) (tkinter, messagebox)

概要

小ネタ。

スクリプト書いていると、たまに処理完了したから、メッセージボックス表示したいときがあります。

たまに、バッチファイル作って、そこから表示しているサンプルも見るのですが

pythonに標準搭載されている tkinter にメッセージボックスがあるので

それ使う方が楽です。さらに、各プラットフォーム毎のネイティブダイアログで表示してくれるので

見た目も変じゃないし。

tkinter.messagebox

tkinter で メッセージボックスを表示するには、以下のようにします。

from tkinter import Tk, messagebox

root = Tk()
root.withdraw()
messagebox.showinfo(title, message)  # 情報ダイアログ表示
root.quit()

簡単。

ついでにデコレータ化

上記の処理を、関数にでもして、そのまま使ってもいいのですが

大抵、こういう処理って、デバッグするときにもちょこっと使ったりします。

デバッグ時に入れる処理ってのは、後から削除する必要がある場合が多いので

あんまり、元のコードの部分に手をいれたくないです。

てことで、以下のようにデコレータにしておいて

def show_complete_dialog(func):
  from functools import wraps

  @wraps(func)
  def _wrapper(*args, **kwargs):
    from datetime import datetime
    from tkinter import Tk, messagebox

    results = func(*args, **kwargs)
    root = Tk()
    root.withdraw()
    messagebox.showinfo('DONE', f'{func.__name__} is DONE at [{datetime.now()}].')
    root.quit()

    return results
  
  return _wrapper

以下のように付与すると、処理終了時に完了ダイアログが出てくれます。

import time

@show_complete_dialog
def func1():
  print('処理開始')
  time.sleep(5)
  print('処理終了')

func1()

ちなみに、今回のサンプルでは OKボタンしかないメッセージボックス使っているので

戻り値は受けていませんが、他のダイアログの場合は、結果をもらって

messageboxに定義されている各定数と比較することで、どのボタンが押下されたのかはわかります。

dialog_result = messagebox.showinfo(titlie, message)
assert dialog_result == messagebox.OK

参考情報

25.1. tkinter — Tcl/Tk の Python インタフェース — Python 3.6.3 ドキュメント


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。