【问题标题】:How to make alert with python without pausing the running program?如何在不暂停正在运行的程序的情况下使用 python 发出警报?
【发布时间】:2018-07-23 20:04:13
【问题描述】:

我有一个python程序,当我用win32api.py发出警报时,正在运行的程序暂停,即使警报启动,如何让它继续工作?

这是代码示例:

time.sleep(3)

win32api.MessageBox(0,'hello','text')

time.sleep(3)

os.system("TASKKILL /F /IM program.exe")

现在当涉及到 win32api.Mes... 部分时,它会暂停程序,直到我单击“确定”,如何防止它暂停?

谢谢!

【问题讨论】:

  • 当您“使用 win32api 发出警报”时,您到底在调用什么?如果你调用一个创建阻塞模式警报的函数,它当然会阻塞。

标签: python python-3.x winapi


【解决方案1】:

正如 MSDN 文档所解释的,MessageBox

显示一个模式对话框,其中包含一个系统图标、一组按钮和一个简短的特定于应用程序的消息,例如状态或错误信息。消息框返回一个整数值,指示用户单击了哪个按钮。

A modal dialog box 旨在阻止您的程序,直到它被处理。这就是它的意思:它将您的程序置于一种特殊的“等待用户”模式。

另外,它显然不能返回用户点击的内容,除非它等到用户点击某些东西。

如果你真的想使用MessageBox,你可以把剩下的工作放到另一个线程上,像这样:

def background():
    time.sleep(3)
    os.system("TASKKILL /F /IM program.exe")
t = threading.Thread(target=background)
t.start()

time.sleep(3)
win32api.MessageBox(0,'hello','text')

或者,您也可以create a modeless dialog,但这需要将程序的其余部分与 win32api 事件循环集成。

【讨论】:

  • 它是正确的,但只是一个额外的问题。如果您使用的是 Windows 10,如何在右下角运行通知?
  • @crdw 这不是警报,也不是对话;那是一个完全不同的 API。有关与语言无关的教程,请参阅 MSDN 中的 Notirication Area。我不知道 pywin32 是否有更具体的内容;如果您已阅读 MSDN 文档并需要帮助将其转换为 pywin32 代码,您应该提出一个单独的问题。
  • @crdw 在 Python 代码中搜索 Shell_NotifyIcon 的示例出现了 this list。我无法保证它有多大用处,但在提问之前可能值得一试。
  • 好吧,你帮了大忙!
  • @crdw:如果您询问 Windows 10 Toast 通知和操作中心,桌面应用程序也可以访问这些。只是非常,非常涉及到那里。如果您敢于调查,这里有 sample code(C++ 和 C#)。
猜你喜欢
  • 2022-12-10
  • 1970-01-01
  • 2021-11-25
  • 2011-07-24
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
相关资源
最近更新 更多