2021/12/06(月) [n年前の日記]
#1 [python] Pythonスクリプトでメッセージボックスを表示したい
Windows10 x64 21H1上で、Pythonスクリプトから、メッセージボックス? メッセージダイアログ? を表示したい。
環境は、Windows10 x64 21H1 + Python 3.9.7 x64。
ググってみた感じでは、以下の2つがある模様。
Windows API を使うソレは、Windows上でしか利用できない。tkinter を使うソレは、おそらく*NIX上でも利用できるのではないかな…。たぶん。
環境は、Windows10 x64 21H1 + Python 3.9.7 x64。
ググってみた感じでは、以下の2つがある模様。
- ctypes を import して Windows API を叩いてメッセージボックスを表示する。
- tkinter を使ってメッセージボックスを表示する。
Windows API を使うソレは、Windows上でしか利用できない。tkinter を使うソレは、おそらく*NIX上でも利用できるのではないかな…。たぶん。
◎ tkinterを使ってみる。 :
tkinterを使って表示してみた。
![03_usetkinter_ss.png](img/_2021/20211206_showmesbox_python/03_usetkinter_ss.png)
単に、messagebox.showinfo() を呼んだだけでは、Tk のルートウインドウが表示されてしまって見た目がちょっとよろしくなかったけど、以下の解説記事を参考にして .withdraw() を呼んだらルートウインドウが表示されないようになってイイ感じになった。
_messageboxとsimpledialogのまとめ - Qiita
_Tkinterメッセージボックス利用時の空ウィンドウ削除方法 - Qiita
import tkinter as tk from tkinter import messagebox message = "Test Message" title = "Title" tkroot = tk.Tk() tkroot.withdraw() messagebox.showinfo(title, message)
![03_usetkinter_ss.png](img/_2021/20211206_showmesbox_python/03_usetkinter_ss.png)
単に、messagebox.showinfo() を呼んだだけでは、Tk のルートウインドウが表示されてしまって見た目がちょっとよろしくなかったけど、以下の解説記事を参考にして .withdraw() を呼んだらルートウインドウが表示されないようになってイイ感じになった。
_messageboxとsimpledialogのまとめ - Qiita
_Tkinterメッセージボックス利用時の空ウィンドウ削除方法 - Qiita
◎ Windows APIを使ってみる。 :
Windows API を使って表示してみた。
![01_usewinapi_ss.png](img/_2021/20211206_showmesbox_python/01_usewinapi_ss.png)
最初、MessageBoxA() に、文字列が入った変数をそのまま渡したら、文字列の最初の1文字しか表示されなくて悩んでしまった。以下のサンプルを参考にして、.encode('shift-jis') をつけてみたところ、文字列が正しく表示されるようになった。おそらく、PythonがUTF-8で処理していて、しかし Windows API に渡す文字列は SJIS じゃないといけない、てな問題でもあるのだろうなと…。
_Python から Windows API を呼び出す - MessageBox の例 | Q備忘録 - 楽天ブログ
あるいは、MessageBoxW とやらを呼んでしまう手もあるらしい。こちらなら .encode() を呼ばなくても文字列をそのまま表示できた。
![02_usewinapi_mboxw_ss.png](img/_2021/20211206_showmesbox_python/02_usewinapi_mboxw_ss.png)
_Python 3 から MessageBox (Windows API) を呼び出す - :wq! (仮称)
_Python: ctypesパターン集 - Qiita
import ctypes message = "Test Message" title = "Title" msgbox = ctypes.windll.user32.MessageBoxA msg = message.encode('shift-jis') cap = title.encode('shift-jis') msgbox(None, msg, cap, 0x00000000|0x00000040)
![01_usewinapi_ss.png](img/_2021/20211206_showmesbox_python/01_usewinapi_ss.png)
最初、MessageBoxA() に、文字列が入った変数をそのまま渡したら、文字列の最初の1文字しか表示されなくて悩んでしまった。以下のサンプルを参考にして、.encode('shift-jis') をつけてみたところ、文字列が正しく表示されるようになった。おそらく、PythonがUTF-8で処理していて、しかし Windows API に渡す文字列は SJIS じゃないといけない、てな問題でもあるのだろうなと…。
_Python から Windows API を呼び出す - MessageBox の例 | Q備忘録 - 楽天ブログ
あるいは、MessageBoxW とやらを呼んでしまう手もあるらしい。こちらなら .encode() を呼ばなくても文字列をそのまま表示できた。
import ctypes message = "Test Message" title = "Title" msgbox = ctypes.windll.user32.MessageBoxW msgbox(None, message, title, 0x00000000|0x00000040)
![02_usewinapi_mboxw_ss.png](img/_2021/20211206_showmesbox_python/02_usewinapi_mboxw_ss.png)
_Python 3 から MessageBox (Windows API) を呼び出す - :wq! (仮称)
_Python: ctypesパターン集 - Qiita
[ ツッコむ ]
#2 [nitijyou] 起きるのがツライ
骨折した親父さんの代わりに朝の犬の散歩を担当してるのだけど、そろそろ朝起きるのが厳しくなってきた。本来07:00には起きてなきゃいけないのに、昨日今日と07:30頃に起きる始末。
[ ツッコむ ]
以上、1 日分です。