如何在Mac上使用Python创建一个消息框?

5

我正在Cybrary上免费学习Python课程(我在3.6版本编码),但是讲师使用Windows系统,而我使用的是Mac系统。目前为止,两者几乎没有任何区别。

当前部分涉及学习和使用Ctypes,"任务"要求编写一个函数,该函数接受两个参数title和body,并创建一个带有这些参数的MessageBox

视频中用作创建Message Box示例的代码:

from ctypes import *

windll.user32.MessageBoxA(0, "Click Yes or No\n", "This is a title\n", 4)

我的代码:

# 2.1 Ctypes: Write a function which takes two arguments, title and body
#  and creates a MessageBox with those arguments
def python_message_box(title, body):
    return windll.user32.MessageBoxA(0, body, title, 0)

运行此代码会产生错误:

File ".../AdvancedActivities.py", line 9, in python_message_box
   return windll.user32.MessageBoxA(0, body, title, 0)
NameError: name 'windll' is not defined

我相信我不必说,我尝试运行时会遇到同样的错误

windll.user32.MessageBoxW(0, body, title, 0)

我在任何地方都找不到人们在Mac电脑上创建消息框的示例。这是一个仅适用于Windows的功能吗?如果是,那么在Mac上的等效功能是什么?

编辑:Mark Setchell的解决方案是让Python运行终端函数来完成windll任务,因此可以使用以下代码替代windll.user32.MessageBoxA(0, body, title, 0)

command = "osascript -e 'Tell application \"System Events\" to
           display dialog \""+body+"\"'"
system(command)

调用 windll.user32.MessageBoxA() 明显是特定于 Windows 的。使用 tkinter 模块几乎可以在任何系统上实现相当的功能。 - martineau
我忘了说,你也可以这样做:.... display dialog "blah blah" with title "Put your title here" - Mark Setchell
我知道这个问题已经有答案了,但是我想告诉你我做了一个简单的包来实现这个功能:https://github.com/ninest/notipy_osx 它基本上是苹果脚本的封装。 - themthem
2个回答

9

如果在任何一台Mac上的终端中输入此命令,您将会收到一个对话框:

osascript -e 'Tell application "System Events" to display dialog "Some Funky Message" with title "Hello Matey"'

在此输入图片描述

进一步的例子请参见这里

所以,只需使用Python子进程调用来运行它...子进程文档,或者使用system()

无需安装任何内容。没有依赖关系。您还可以使用相同的技术要求用户输入值、选择文件或目录以及选择颜色。所有对话框都是本地Mac对话框——不是一些丑陋的仿制品。


1
好的,这很酷。但目前我必须运行 system("osascript -e 'Tell application \"System Events\" to display dialog \""+body+"\"'") 才能让它工作。subprocess 有点奇怪。 - elkshadow5
1
请小心处理这个问题 - 如果攻击者可以操纵“一些奇怪的消息”,他们可以通过在消息中添加引号和shell命令来在用户机器上运行任意代码。 - Ben

1
import os

body_Str="Body of Dialog"

title_Str="Title"

os.system("""osascript -e \'Tell application \"System Events\" to display dialog \""+body_Str+"\" with title \""+title_Str+"\"\'""")

这是更好的。

请简要地解释一下你的代码是做什么的,以及它如何回答这个问题。请参考如何撰写一个好的答案? - Alexandre B.
尝试在Python 3.11中运行此代码,但是出现了“body_Str未定义”的错误...如何将Python变量传递给osascript? - tanno oba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接