如何中断xlib的next_event()?

2024-09-24 16:41:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

while self.doRun:                
      event=root.display.next_event()
      if event.type==X.KeyPress:
      ....

但是next_event()是众所周知的等待实际事件。那么如何在不等待另一次按键的情况下停止循环呢?我在考虑通过Xlib用keypress发送假事件,但我不认为这是一个正确的方法。另外,该事件上的.terminate()不是一个选项。。。在pyside中,它会导致整个应用程序崩溃:

Fatal Python error: This thread state must be current when releasing

有什么想法吗?在


Tags: selfeventiftypedisplay事件root全局
2条回答

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

基于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创建了一个要点。在

你可以发送一个关闭事件(在X11a destroy event也许?),更明确地说。另一个想法是先检查是否有任何事件等待处理:

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

但是这构成了busy-waiting,所以我选择第一个选项。在

相关问题 更多 >