【问题标题】:wxPython app becomes unresponsive on all threads?wxPython 应用程序在所有线程上都没有响应?
【发布时间】:2014-07-07 12:43:41
【问题描述】:

在我继承 wx.Panel 的类中,我有这个方法:

def KeyEventProcedure(self):
    while True:
        z = msvcrt.getch()
        if ord(z) == 27:
            self.OutputText("Stopping.")
            self.program_stopped = True
            print "IT'S WORKIIIIING"

在我的 PanelClass 的 __init__ 方法中,我有这个:

self.program_stopped = False
keyThread = Thread(target = self.KeyEventProcedure)
#keyThread.setDaemon(1) //I tried with and without this call, makes no difference
keyThread.start()

在我的应用程序的许多地方我都有这个检查:

if self.program_stopped == True:
    self.program_stopped = False
    return

我知道我可以在KeyEventProcedure 方法中退出整个应用程序,但我不想退出应用程序,我只想将当前正在执行的函数转到return。但是,当我启动应用程序时,无论按多少次ESC,它都不会打印,并且当前正在执行的操作也不会返回。

【问题讨论】:

  • 开始故障排除。 getch 会被调用吗?它回来了吗?它返回什么?
  • @DavidSchwartz 它只通过KeyEventProcedure 一次,即使它是while True:,它似乎也没有崩溃或任何东西......而且我不会在任何地方过早地杀死线程跨度>
  • 它做的最后一件事是什么?它会调用getch 而不返回吗?
  • 程序启动时,KeyEventProcedure运行一次,它命中的最后一个断点在z = msvcrt.getch(),然后函数突然退出,但没有打印错误。
  • 尝试将其放入:while True: try: z = msvcrt.getch() if ord(z) == 27: self.OutputText("Stopping.") self.program_stopped = True print "IT'S WORKIIIIING" except: print sys.exc_info() 无济于事

标签: python multithreading wxpython


【解决方案1】:

如果你只想捕捉按键,你应该使用 wxPython 的内置功能。尝试绑定到 wx.EVT_KEY_DOWN 甚至 wx.EVT_CHAR,而不是使用这种仅限 Windows 的方法。请参阅以下内容:

另外,您不应该尝试直接从线程访问 wxPython 程序。如果您需要从线程更新 UI,那么您必须使用 wxPython 线程安全方法,例如 wx.CallAfter 或 wx.PostEvent。有关更多信息,请参阅以下内容:

【讨论】:

  • 但我希望注册按键,即使主线程上不断运行某些东西。只是msvcrt.getch()msvcrt.getwch() 都失败了,没有任何错误或没有抛出任何异常......
  • @Mike- 从第一个链接中的示例中,我意识到按键事件必须绑定到像按钮这样的小部件。难道不能对框架或面板做同样的事情吗?否则将需要将 key_press 事件绑定到框架中的每个小部件...
  • 您可以绑定到面板/框架,但这仅适用于没有小部件具有焦点的情况。如果面板有一个可以接受焦点的孩子,则面板将始终尝试将焦点传递给它的一个孩子。否则,您可能需要查看 AcceleratorTable。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多