我正在使用QThread
(pyside)来处理X11上的全局热键。我有一些简单的while循环,看起来像:
while self.doRun:
event=root.display.next_event()
if event.type==X.KeyPress:
....
但next_event()
因等待实际事件而闻名。那么如何在不等待另一次击键的情况下停止该循环呢?我正在考虑通过Xlib发送带有按键的假事件,但我认为这不是正确的方法。此事件的.terminate()
也不是一个选项...与pyside一起崩溃整个应用程序:
致命的Python错误:释放
时,此线程状态必须是最新的
有什么想法吗?
答案 0 :(得分:0)
您可以发送一个关闭事件(在X11 a destroy event中也许?),以便更明确。另一个想法是检查是否有任何事件先挂起:
if root.display.pending_events():
event = root.display.next_event()
# process event
然而,这构成busy-waiting,所以我选择第一个选项。
答案 1 :(得分:0)
这是一个很晚的答案,但我遇到了同样的问题,因此也许对某人还是有帮助的。
基于documentation,您可以使用Python的select module接收超时事件。
使用select的解决方案基本上包括两个步骤:1)处理所有未决事件,以及2)等待 select 调用,直到新的I / O事件到达。如果没有事件到达,则该方法将在一定时间后超时。
这样的事件循环看起来像这样:
# Main loop, handling events
def loop(self):
self.loop_cond = True
timeout=5 # timeout in seconds
while self.loop_cond:
# handle all available events
i = self.d.pending_events()
while i > 0:
event = self.display.next_event()
self.handle_event(event)
i = i - 1
# Wait for display to send something, or a timeout of one second
readable, w, e = select.select([self.display], [], [], timeout)
# if no files are ready to be read, it's an timeout
if not readable:
self.handle_timeout()
我用small example创建了要点。