flet+pygame+pyopegl. Нужно "встроить" окно pygame в окно flet

Я пишу ученический проект в котором мне нужно создать простой интерфейс обучающей программы по стереометрии. Главной функцией которой будуд 3d модели чертежа к каждой задаче. Я создал 3d модель куба при помощи библиотек pygame и opengl. так же я создал окно с помощью библиотеки flet в котором есть кнопка которая открывает окно с кубом в отдельном потоке.


import flet as ft
import threading
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

# Функция для рисования пирамиды
def cube():
    vertices = (
        (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1),
        (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1)
    )
    edegs = (
        (0, 1), (0, 3), (0, 4), (2, 1), (2, 3), (2, 7),
        (6, 3), (6, 4), (6, 7), (5, 1), (5, 4), (5, 7),
    )
    glBegin(GL_LINES)
    glColor3fv((1, 1, 1))
    for edeg in edegs:
        for vertex in edeg:
            glVertex3fv(vertices[vertex])

    glEnd()



def run_pygame():
    pygame.init()
    screen = (800, 600)
    pygame.display.set_mode(screen, DOUBLEBUF | OPENGL)


    glEnable(GL_DEPTH_TEST)

    glMatrixMode(GL_PROJECTION)
    gluPerspective(70, (screen[0] / screen[1]), 0.1, 50.0)

    glMatrixMode(GL_MODELVIEW)
    glTranslate(0.0, 0.0, -5)

    rot_x, rot_y, zoom = 0, 0, -0.5

    clock = pygame.time.Clock()
    busy = True
    while busy:

        mouse_buttons = pygame.mouse.get_pressed()
        button_down = mouse_buttons[0] == 1

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                busy = False
            elif event.type == pygame.MOUSEMOTION:
                if button_down:
                    rot_x += event.rel[1]
                    rot_y += event.rel[0]
            elif event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 4:
                    zoom += 0.2
                if event.button == 5:
                    zoom -= 0.2

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        glPushMatrix()
        glTranslatef(0.0, 0.0, zoom)
        glRotatef(rot_x, 1, 0, 0)
        glRotatef(rot_y, 0, 1, 0)
        cube()

        glPopMatrix()

        pygame.display.flip()
        clock.tick(100)

    pygame.quit()
# Функция, которая запускает Pygame в отдельном потоке
def start_pygame(e):
    threading.Thread(target=run_pygame).start()

# Основная функция для создания приложения с Flet
def main():
    # Создаем Flet приложение и привязываем его к текущей сессии
    ft.app(target=app, port=8550)

# Функция, связанната с приложением
def app(page: ft.Page):
    start_button = ft.ElevatedButton("Запустить Pygame", on_click=start_pygame)
    page.add(start_button)

if __name__ == '__main__':
    main()

проблема в том, что мне нужно чтобы при нажатии на кнопку окно pygame открывалось внутри окна flet как встроенное окно, так чтобы возможность вращать куб сохранилась... Я знаю, что эти библиотеки не совсем совместимы, но может вы знаете какое-то решение для моей проблемы?


Ответы (0 шт):