mieki256's diary



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上でも利用できるのではないかな…。たぶん。

tkinterを使ってみる。 :

tkinterを使って表示してみた。

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

単に、messagebox.showinfo() を呼んだだけでは、Tk のルートウインドウが表示されてしまって見た目がちょっとよろしくなかったけど、以下の解説記事を参考にして .withdraw() を呼んだらルートウインドウが表示されないようになってイイ感じになった。

_messageboxとsimpledialogのまとめ - Qiita
_Tkinterメッセージボックス利用時の空ウィンドウ削除方法 - Qiita

Windows APIを使ってみる。 :

Windows API を使って表示してみた。

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

最初、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

_Python 3 から MessageBox (Windows API) を呼び出す - :wq! (仮称)
_Python: ctypesパターン集 - Qiita

以上です。

過去ログ表示

Prev - 2021/12 - Next
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

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project