[Python]彈出視窗 alert box

介紹如何使用 python 寫彈跳視窗,其實網路上可以找到蠻多方法的,我這邊就簡單介紹幾個。
以下會分為 mac 和 windows 兩個系統來討論。

Mac

1. easygui 套件

# 記得先安裝 easygui 套件
from easygui import msgbox
msgbox('Stuff')

這個套件基本上蠻簡單的,只要使用msgbox()就好,
如果只是要在跑程式的時候使用沒有太大問題,

更多 easygui 套件 的介紹

但如果要把程式碼打包時(pyinstaller套件) 這個方法就會失效,會出現錯誤訊息

ImportError: No module named easygui
[3310] Failed to execute script alterwindow

所以如果要讓程式碼打包後可以出現彈跳視窗可以使用內建的 system。

2. os.system()

import os

os.system("osascript -e 'Tell application \"System Events\" to display dialog \""+"Some Funky Message"+"\"'")

這方法其實就是使用 python 執行系統命令。 也就是,其實把 os.system() 括號裡的東西

osascript -e 'Tell application "System Events" to display dialog "Some Funky Message"'

打在 terminal 裡會執行的東西。

將以上命令打在 terminal 會發現出現一個彈跳視窗,內容是 Some Funcky Message。 system_msg.jpg

所以在 python 裡面同樣執行會產生同樣的結果。

而這個方法將程式打包後可以正確執行。

Windows

1. easygui 套件

# 記得先安裝 easygui 套件
from easygui import msgbox
msgbox('Stuff')

基本上和 mac 一樣,將程式碼打包後也無法正常執行。

2. ctypes 套件

# 不需另外安裝
import ctypes
ctypes.windll.user32.MessageBoxA(0, "Your text", "Your title", 1)

# 或著你可以定義一個 function
def Mbox(title, text, style):
    return ctypes.windll.user32.MessageBoxA(0, text, title, style)
Mbox('Your title', 'Your text', 1)

# 如果是要輸出中文,記得重新 encode
ctypes.windll.user32.MessageBoxA(0, "內容".decode("utf-8").encode("big5"), "標題".decode("utf-8").encode("big5"), 1)

這個方法也可以打包後執行。

另外, 會看到有些地方使用

ctypes.windll.user32.MessageBoxW()

而不是

ctypes.windll.user32.MessageBoxA()

但執行後會發現,ctypes.windll.user32.MessageBoxW()這個方法會出現亂碼。

這兩個的差別在MessageBoxW要使用 unicode 編碼,而MessageBoxA是 ascii 編碼。
有人回答這個問題 。

這邊 mac 和 windows 各介紹了兩種方法,其實還有很多方法啦,只要能符合需求的都是好方法!