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 как встроенное окно, так чтобы возможность вращать куб сохранилась... Я знаю, что эти библиотеки не совсем совместимы, но может вы знаете какое-то решение для моей проблемы?