wxpython:等待事件mainloop冻结

时间:2014-08-18 16:16:41

标签: multithreading wxpython

我是wxPython的新手,所以请保持温柔。我正在尝试使用wxPython制作游戏。我需要能够在游戏进行过程中处理事件(按钮点击)。

过程是:

  1. 交易卡
  2. 等待用户输入
  3. 继续相应
  4. 我实施它的方式是:

    app = wx.App()
    g = Game() # calls g.Play() which executes the process above
    app.Mainloop()
    

    但应用程序冻结了。我认为问题与在执行流程时无法响应事件有关。我怎么能绕过这个?

    我看过线程,但看不出如何在我的情况下使这个工作。如果我创建一个新线程来处理Game()中的用户输入,那么将无法更新Game()中的值。

    我确信有一种“正确”的做法,我不知道,因为我不熟悉wxPython。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

wxPython(和所有GUI工具包)都是事件驱动的。这意味着他们都在等待用户“做某事”,比如按下按钮,移动鼠标,按键盘上的键等等。当使用这些事情之一时,wxPython检查是否有任何这些事件绑定到事件处理程序。如果不是,wx通常会忽略这些事件。

您可以在此处了解如何正确绑定事件:

因此,当您启动该程序时,它应该可能在开始时处理卡片,或者可能提示用户查看他们是想要开始新游戏还是可能继续游戏。之后,应用程序将等待用户“做某事”。如果用户执行需要很长时间的进程(如复杂计算,下载大文件等),则应将该进程放入线程中。如果你没有将它放入一个线程,那么该过程将阻止UI的主循环,你的应用程序将冻结。有关wxPython和线程的信息,请参阅以下文章:

我希望这些链接可以帮助您。

答案 1 :(得分:0)

哟不需要单独的函数play()来运行游戏。只需设置事件处理程序即可在每个事件中计算游戏状态,从而导致游戏移动。

一个好的选择是将游戏状态定义为每个玩家手中的牌,已经玩过的牌和得分,都被定义为状态class的对象。

首先勾勒出游戏架构的大纲。如果您不熟悉wxPython,您可能还需要查看一些示例和文档。