【问题标题】:Python - Constantly running an event handler without wxPython?Python - 在没有 wxPython 的情况下不断运行事件处理程序?
【发布时间】:2014-07-21 06:22:26
【问题描述】:

我目前正在尝试使用 Python 2.7(在 Windows 7 上)编写一个脚本,该脚本使用通知软件 Snarl 显示通知。连接到 Snarl 需要 pySnarl 模块 (link)。 pySnarl 模块包括事件处理程序,它基本上检查通知是否已被用户关闭或单击,并允许脚本在发生此类事件时运行函数。我正在尝试实现这一点,但是我似乎无法让事件处理程序不断地监听点击。有一个由模块(link) 的作者编写的示例脚本,它显示了事件处理程序的使用,它完美地工作,但它通过使用 wxPython 的 app.MainLoop() 命令让事件处理程序监听点击。我不能这样做,因为我的脚本是无 GUI 的,我只想使用 Windows 任务计划程序在后台不时运行它。我尝试了一个 while True 循环来让事件处理程序方法不断运行,但它除了消耗大量 CPU 之外什么也没做。这是我的脚本(在代码格式中,因为我现在不能发布超过 2 个链接):

    http://pastebin.com/4udVehg1

TLDR;我想要一个事件处理程序来监听事件,但我不知道如何在不使用 wxPython 的 app.MainLoop() 功能的情况下让它运行,并且我希望我的脚本是无 GUI 的。

任何帮助将不胜感激。

问候, 乔诺。

【问题讨论】:

标签: python python-2.7 wxpython python-2.x


【解决方案1】:

找到了解决办法。我只需要在脚本末尾运行以下命令:

while event_handling is True:
    win32gui.PumpMessages()     # Check for events, needs to be sent a WM_QUIT message to stop, handled in disable_event_handling()
    time.sleep(0.1)             # Check every 0.1 seconds

然后在一个事件被激活时,只需调用以下函数来停止脚本检查事件:

main_thread_id = win32api.GetCurrentThreadId()
event_handling = True

def disable_event_handling():   # Puts a stop to the loop that checks for events
    global event_handling
    event_handling = False
    win32api.PostThreadMessage(main_thread_id, win32con.WM_QUIT, 0, 0)  # Sends a QUIT message to win32gui.PumpMessages(), without this it wouldn't stop checking for messages to pump
    return event_handling

感谢大家的帮助和建议 c:

【讨论】:

    【解决方案2】:

    听起来像是 PyPubSub 的工作:一个提供发布-订阅 Python API 的包,有助于基于事件的编程。

    查看:http://pubsub.sourceforge.net/

    编辑:PyPubSub 位于 https://github.com/schollii/pypubsub(自 2016 年起)

    【讨论】:

    • 感谢您的提示,它看起来很有趣,但我不知道如何将其集成。我正在使用的绑定使用 win32com.client.DispatchWithEvents() 和一个处理程序类,其中定义了事件。我将如何使用 PyPubSub 让该类不断地关注事件?
    • 所有你需要做的就是设置一个订阅,然后当你想发送一个“事件”时,你发布它。该网站有示例。还有另一个名为 PyDispatcher 的包,它是 pubsub 的替代品:pydispatcher.sourceforge.net
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2011-08-15
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多