Как интегрировать Pygame и PyQt4?

Я использую Python 2.7 и Ubuntu 14.04.

Я пытаюсь сделатьэтот для того, чтобы мое окно пигмея в моем графическом интерфейсе

На некоторых платформах возможно встраивать отображение pygame в уже существующее окно. Для этого переменная среды SDL_WINDOWID должна быть установлена ​​в строку, содержащую идентификатор окна или дескриптор. Переменная окружения проверяется при инициализации дисплея 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

Что я должен сделать, чтобы встроить мое окно пигмея вfrmMain?

Заранее спасибо.

 Photon09 июл. 2016 г., 18:10
Почему бы не рендерить все на поверхность вне экрана, а затем скопировать пиксели этой поверхности в окно PyQt4. Производительность не достаточно хороша?
 Pablo Ladreyt09 июл. 2016 г., 19:26
Есть ли способ скопировать поверхностные пиксели в окно 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_()
 Pablo Ladreyt10 июл. 2016 г., 22:55
На самом деле ваш пример был то, что я искал :) Спасибо!
 Pablo Ladreyt10 июл. 2016 г., 17:40
Я собираюсь попробовать, если это работает, спасибо! Но есть ли способ встроить все окно?
 Photon10 июл. 2016 г., 19:32
Я не уверен, что вы имеете в виду, но если вам нужно полноэкранное приложение, то, если вы можете создать окно без полей PyQt4 на весь экран, это должно быть выполнимо.

Ваш ответ на вопрос