Python - 如何在不使用wxPython的情况下持续运行事件处理程序?
我现在正在尝试用Python 2.7(在Windows 7上)写一个脚本,目的是通过通知软件Snarl来显示通知。要连接Snarl,需要用到pySnarl模块 (链接)。这个pySnarl模块里有一个事件处理器,它的作用是检查通知是否被用户关闭或点击,如果发生了这样的事件,就可以让脚本执行某个功能。我想实现这个功能,但我似乎无法让事件处理器持续监听点击事件。模块的作者写了一个示例脚本 (链接),这个示例展示了如何使用事件处理器,并且运行得很好,但它是通过wxPython的app.MainLoop()命令来让事件处理器监听点击的。我不能这样做,因为我的脚本没有图形界面,我只是想用Windows任务计划程序偶尔在后台运行它。我尝试了一个while True循环来让事件处理器方法持续运行,但这样做除了消耗大量CPU外没有任何效果。以下是我的脚本(因为我现在不能发超过两个链接,所以用代码格式显示):
http://pastebin.com/4udVehg1
总结一下;我想让事件处理器监听事件,但我不知道如何在不使用wxPython的app.MainLoop()功能的情况下让它运行,并且我希望我的脚本没有图形界面。
任何帮助都将非常感激。
祝好,
Jono。
2 个回答
0
听起来这个问题可以用PyPubSub来解决:这是一个提供发布-订阅模式的Python库,可以帮助你进行基于事件的编程。
你可以看看这个链接: http://pubsub.sourceforge.net/
补充说明:PyPubSub的最新信息可以在这里找到 https://github.com/schollii/pypubsub(自2016年以来)
0
找到了一个解决办法。我只需要在我的脚本最后加上以下代码:
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: