【问题标题】:Adding wxpython in pygame在 pygame 中添加 wxpython
【发布时间】:2012-02-06 13:20:27
【问题描述】:

我正在寻找一种可以将 wxPython GUI 元素添加到 pygame 中的方法。如果有其他方法可以解决将 GUI 元素添加到 pygame 的目的,请提出建议。我在安装 PGU 时遇到问题。感谢您的帮助。

【问题讨论】:

  • 令人惊讶的是,python 无法添加按钮,在 Java 中它非常简单。请证明我错了!!
  • stackoverflow.com/questions/8794506/… 的副本。请继续更新您的原始问题,详细说明您遇到的问题。
  • 这是可能的,就像我以前做过的那样。虽然我希望它更兼容。 wxPython 比任何 pygame GUI 库都要好得多。 PGU 糟透了!!!甚至不用费心下载它。当您将 pygame 放入 wxpython 时,它非常限制您可以做的事情,虽然 GUI 明智,但它看起来不错。

标签: user-interface wxpython pygame


【解决方案1】:

不;您可以将 wxWidgets 添加到 PyGame。添加打开/保存对话框、按钮等很简单。有时当您尝试共享区域时会变得很糟糕(如上所述,存在冲突的窗口系统),但这绝对是可行的。

我是几年前写的,所以很乱;但至少它很简单。它应该可以帮助您入门:

class SDLThread:
    def __init__(self,screen):
        self.m_bKeepGoing = self.m_bRunning = False
        self.screen = screen
        self.color = (255,0,0)
        self.rect = (10,10,100,100)
    def Start(self):
        self.m_bKeepGoing = self.m_bRunning = True
        thread.start_new_thread(self.Run, ())
    def Stop(self):
        self.m_bKeepGoing = False
    def IsRunning(self):
        return self.m_bRunning
    def Run(self):
        while self.m_bKeepGoing:
            pass
##            GetInput()
##            Draw()
        self.m_bRunning = False;
class SDLPanel(wx.Panel):
    def __init__(self,parent,ID,tplSize):
        global pygame
        wx.Panel.__init__(self, parent, ID, size=tplSize)
        self.Fit()
        os.environ['SDL_WINDOWID'] = str(self.GetHandle())
        os.environ['SDL_VIDEODRIVER'] = 'windib'
        import pygame
        pygame.init()
        icon = pygame.Surface((1,1));icon.set_alpha(0);pygame.display.set_icon(icon)
        global Surface
        Surface = pygame.display.set_mode(tplSize)
        self.thread = SDLThread(Surface)
        self.thread.Start()
    def __del__(self):
        self.thread.Stop()

【讨论】:

  • 这看起来很有希望,但你能展示你如何将它与 pygame 演示结合起来吗?
  • @MarcMaxmeister 如果我今天要写这个答案,我会说:“不要这样做。不要将 wx 小部件添加到 pygame 中,而是将 pygame 表面操作添加到 wx 应用程序中。这个这将变得更简单、更清晰、更快、更容易。”
  • 所以也许写“它是微不足道的”还为时过早。我花了几个小时编写自己的函数来在 pygame 中创建右键单击上下文菜单,虽然它们可以工作,但它们似乎没有一个可以正常工作的结构。为此过多地参与游戏循环。
【解决方案2】:

我认为这是不可能的,因为 wxPython(使用 wxWidgets c++)是窗口管理系统的包装器,它依赖于操作系统函数在屏幕上绘制(它根据操作系统转换为正确的系统调用)。

Pygame 使用 SDL 和一个简单的窗口管理系统代码,它调用几个操作系统函数只是为了创建窗口并将其交给 SDL 在其上绘制,就像画布一样。

一种方法是:

  • 使用 ctypes 对 OS 库文件进行 C 调用以绘制系统原生小部件,这样您就不会使用任何 pygame 函数。

其他方式(丑陋,不确定是否有效):

  • 我不知道怎么做,但找到一种方法将小部件转换为图像缓冲区对象并像表面(普通位图)一样使用它。

我认为你应该做什么:

  • 使用 pygame,使用表面和鼠标/键盘事件构建您自己的 GUI 来控制它或下载一些预制的。

  • 坚持使用 wx,您可以在系统原生主题上轻松构建 GUI,也可以使用 DC(绘制上下文)像 pygame 一样绘制,并且可能(不确定)将 pygame 上下文作为一个小部件包含到 wx 中。 您可以从 wx 拥有自己的事件处理程序中受益。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 2011-07-14
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    相关资源
    最近更新 更多