Python 如何打破xlib';下一个事件是什么?

Python 如何打破xlib';下一个事件是什么?,python,pyside,xlib,qthread,Python,Pyside,Xlib,Qthread,我正在使用QThread(pyside)处理X11上的全局热键。我有一些简单的while循环,看起来像: while self.doRun: event=root.display.next_event() if event.type==X.KeyPress: .... 但是next\u event()被认为是在等待实际事件。那么,如何在不等待另一次击键的情况下停止该循环呢?我在考虑通过Xlib用按键发送假事件,但我认为这不是一

我正在使用
QThread
(pyside)处理X11上的全局热键。我有一些简单的while循环,看起来像:

while self.doRun:                
      event=root.display.next_event()
      if event.type==X.KeyPress:
      ....
但是
next\u event()
被认为是在等待实际事件。那么,如何在不等待另一次击键的情况下停止该循环呢?我在考虑通过Xlib用按键发送假事件,但我认为这不是一个正确的方法。另外,该事件上的
.terminate()
不是一个选项。。。使用pyside,它会使整个应用程序崩溃,原因是:

致命的Python错误:释放时此线程状态必须为当前状态


有什么想法吗?

您可以发送一个关闭事件(可能是X11?),更明确地说。另一个想法是首先检查是否有任何事件挂起:

if root.display.pending_events():
    event = root.display.next_event()
    # process event

但是这构成了,所以我会选择第一个选项。

这是一个迟来的答案,但我有同样的问题,所以可能对某些人还是有帮助的

基于,您可以使用Python来接收带有超时的事件

使用select的解决方案基本上包括两个步骤:1)处理所有未决事件,2)使用select调用等待新的I/O事件到来。如果没有事件到达,该方法将在特定时间后超时

这样的事件循环可能如下所示:


#主循环,处理事件
def回路(自):
self.loop_cond=True
超时=5#以秒为单位的超时
而self.loop_cond:
#处理所有可用事件
i=自身d.未决事件()
当i>0时:
event=self.display.next_event()
self.handle_事件(事件)
i=i-1
#等待显示器发送内容,或等待一秒钟的超时
可读,w,e=select.select([self.display],[],超时)
#如果没有准备好读取的文件,则为超时
如果不可读:
self.handle_timeout()

我已经用一个.

创建了一个要点,我已经尝试了
挂起的事件
,但正如我所预料的那样,这对应用程序性能很糟糕。加上睡眠(这本身就是愚蠢的)会让情况变得更糟。您是否有一些如何发送关闭事件的示例?我需要注册吗?我没有找到太多关于这方面的信息…@middleofdreams是的,关于Qt绑定的文档非常稀少。我猜您应该能够以与模拟按键事件相同的方式发送此事件,只需使用。此外,您可能还想签出本机Qt的文档-它包含更多信息,其中大部分也适用于Qt的绑定。好的,我想您是在谈论Xlib事件。。。事实上,QThread的close事件并不像我想的那样工作。@middleofdreams不,对不起,我把这两个弄糊涂了。Qt的close事件当然不会影响QThread。在这种情况下,您需要在X11中使用类似的内容—可能是一个销毁事件(我在答案中添加了一个链接)?