我正在使用Pyglet编写游戏,但我想包含几个wx对话框。 我可以做一些简单的事情,比如文本输入对话框和消息框(作为模式对话框,阻止直到确定或取消按下),但在多玩家环境中......这很难实现。 我使用wx python,Phoenix 4.0.0b1,我需要"驱动"来自pyglet的wx事件循环。我可以安排功能在任何时间间隔运行,但我不确定如何完成"驾驶"事件循环 有EventLoopBase,提及的方法包括' Dispatch'' DispatchTimeout'和' Pending'但我不确定是否wx.App.MainLoop()在运行wx.EventLoopBase.Run()之前做了一些特别的事情;我不认为我可以创建一个wx.App()实例,并且有一个函数检查是否有待处理的事件和(如果有的话),运行Dispatch。
有谁知道"对"这样做的方法?如果我不必,我宁愿不把这个循环推到另一个主题。
如果我上面提到的内容在作品中有所作为,这可能最终不是一个问题,但是为了防止我把它扔到那里以确保我不会破坏它的东西,如果它似乎有用,或者它根本不起作用。
更新:下面是我写的一些代码,试图解决这个问题。而不是获取wx.App的实例,我得到这个类之一并正常调用MainLoop()。 它也不像它需要的那样工作; wx并不认为我使用的事件循环是" main"一,我相信这是导致我运行Show()的对话框出现问题的原因。
希望这能更好地说明我尝试做的事情,即在一段时间内调用单一方法来处理wx的循环。 通常情况下,wx.App实例上的MainLoop()在执行此操作时会阻塞,因此wx需要驱动其他任何东西的循环,而我试图让它以相反的方式工作。 wx的邮件列表here上还有一个帖子,它提出了同样的问题,但没有其他解决方案而不是"只是让wx成为主循环并运行pyglet' s循环上wx.Timer"已建议。然而,正如我在那里提到的那样,pyglet的循环将完成大部分工作,所以尝试这样做似乎更有意义。
代码:
# Overridden classes for wx
import wx
class App(wx.App):
def MainLoop(self, clock, loop_interval, idle_ticks=50):
"""Indicates that the event loop should start.
This implementation uses pyglet's clock to drive the event loop, and will return immediately after scheduling the driving of the loop.
Args:
clock: pyglet's clock instance; is used to schedule the main loop.
loop_interval: in milliseconds, how often the wx loop should be ticked (events processed).
idle_ticks: how many ticks with no UI events to process should elapse before ProcessIdle is called.
"""
self.loop_interval = loop_interval
self.idle_ticks = idle_ticks
self.ticks = 0
self.evtloop = wx.GUIEventLoop()
wx.EventLoop.SetActive(self.evtloop)
self.run = True
clock.schedule_interval(self.drive_loop, loop_interval)
def drive_loop(self, *a):
"""Drives the main wx event loop."""
if self.run == True:
while self.evtloop.Pending(): # if there is at least one event to be processed
self.evtloop.Dispatch() # process one event
else: # no UI events
self.ticks += 1
if self.ticks >= self.idle_ticks:
self.evtloop.ProcessIdle()
self.ticks = 0