Pygame和PyQt4如何集成?

Posted

技术标签:

【中文标题】Pygame和PyQt4如何集成?【英文标题】:How to integrate Pygame and PyQt4? 【发布时间】:2016-11-11 19:31:39 【问题描述】:

我使用的是 python 2.7 和 Ubuntu 14.04。

我正在尝试 this 以便将我的 pygame 窗口放在我的 GUI 中

在某些平台上,可以将 pygame 显示嵌入到已经存在的窗口中。为此,必须将环境变量 SDL_WINDOWID 设置为包含窗口 ID 或句柄的字符串。初始化pygame显示时检查环境变量

这就是我所做的:

from PyQt4 import QtGui, QtCore
import os
import subprocess
import sys

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
    MainWindow.setWindowModality(QtCore.Qt.ApplicationModal)
    MainWindow.setFixedSize(800, 600)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    self.iniMap()

def iniMap(self):
    command = "xprop -root _NET_ACTIVE_WINDOW"
    output = subprocess.Popen(["/bin/bash", "-c", command], stdout=subprocess.PIPE)
    activeWindowID = str(output.communicate()[0].decode("utf-8").strip().split()[-1])
    os.environ['SDL_WINDOWID'] = activeWindowID
    import pygame
    pygame.init()
    screen = pygame.display.set_mode((565, 437), pygame.NOFRAME)

class frmMain(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(frmMain, self).__init__(parent, flags=QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self.setupUi(self)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    form = frmMain()
    form.show()
    sys.exit(app.exec_())

但它不起作用。它只显示我的 PyQt 窗口。我不知道是我做错了什么还是pygame无法与PyQt集成

我应该怎么做才能让我的 pygame 窗口嵌入到 frmMain 中?

提前谢谢你。

【问题讨论】:

为什么不全部渲染到屏幕外的表面,然后将此表面像素复制到 PyQt4 窗口。是不是性能不够好? 有没有办法将表面像素复制到 PyQt4 窗口?我想我可以试试,但我不知道该怎么做。 【参考方案1】:

根据上面的评论,这是一个示例解决方案:

from PyQt4 import QtGui
import pygame
import sys

class ImageWidget(QtGui.QWidget):
    def __init__(self,surface,parent=None):
        super(ImageWidget,self).__init__(parent)
        w=surface.get_width()
        h=surface.get_height()
        self.data=surface.get_buffer().raw
        self.image=QtGui.QImage(self.data,w,h,QtGui.QImage.Format_RGB32)

    def paintEvent(self,event):
        qp=QtGui.QPainter()
        qp.begin(self)
        qp.drawImage(0,0,self.image)
        qp.end()


class MainWindow(QtGui.QMainWindow):
    def __init__(self,surface,parent=None):
        super(MainWindow,self).__init__(parent)
        self.setCentralWidget(ImageWidget(surface))



pygame.init()
s=pygame.Surface((640,480))
s.fill((64,128,192,224))
pygame.draw.circle(s,(255,255,255,255),(100,100),50)

app=QtGui.QApplication(sys.argv)
w=MainWindow(s)
w.show()
app.exec_()

【讨论】:

如果可行,我会尝试,谢谢!但是有没有办法嵌入整个窗口? 我不太清楚你的意思,但是如果你想要一个全屏应用,那么只要你能在整个屏幕上创建一个PyQt4无边框窗口,应该是可行的。 其实你的例子就是我要找的 :) 谢谢! 有没有一种有效的方法可以使用此代码,但它可以不断更新 pygame 图像?我尝试了“timerEvent”功能和 Qt 计时器,但在我调整 Qt UI 大小之前,Pygame 图像似乎并没有真正更新或更改。为什么是这样?我该如何解决? 没关系。我想到了。当定时器事件函数关闭时,就像“self.update()”一样简单。

以上是关于Pygame和PyQt4如何集成?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 matplotlib 函数与 QGraphicsView 集成?

PyCharm + PyQt4 环境搭建

Python 桌面集成 - 拖放

Windows下PyQt4开发环境搭建

PyQt4 应用程序中的 Python 编辑器

pygame小游戏开发