Incrustar una ventana de Pygame en un marco Tkinter o WxPython

Un amigo y yo estamos haciendo un juego en pygame. Nos gustaría tener una ventana de pygame incrustada en un marco tkinter o WxPython, de modo que podamos incluir entrada de texto, botones y menús desplegables que sean compatibles con WX o Tkinter. He buscado en Internet una respuesta, pero todo lo que he encontrado es gente que hace la misma pregunta, ninguno de estos ha sido bien respondido.

¿Cuál sería la mejor manera de implementar una visualización de pygame incrustada en un marco tkinter o WX? (TKinter es preferible)

Cualquier otra forma en la que estas características puedan incluirse junto con una pantalla de pygame también funcionaría.

De acuerdo con esta pregunta y la respuesta aceptada, la forma más sencilla de hacerlo sería utilizar un marco de dibujo SDL.

Este código es el trabajo de SO usuario Alex Sallons .

import pygame import Tkinter as tk from Tkinter import * import os root = tk.Tk() embed = tk.Frame(root, width = 500, height = 500) #creates embed frame for pygame window embed.grid(columnspan = (600), rowspan = 500) # Adds grid embed.pack(side = LEFT) #packs window to the left buttonwin = tk.Frame(root, width = 75, height = 500) buttonwin.pack(side = LEFT) os.environ['SDL_WINDOWID'] = str(embed.winfo_id()) os.environ['SDL_VIDEODRIVER'] = 'windib' screen = pygame.display.set_mode((500,500)) screen.fill(pygame.Color(255,255,255)) pygame.display.init() pygame.display.update() def draw(): pygame.draw.circle(screen, (0,0,0), (250,250), 125) pygame.display.update() button1 = Button(buttonwin,text = 'Draw', command=draw) button1.pack(side=LEFT) root.update() while True: pygame.display.update() root.update() 

Este código es multiplataforma, siempre que la línea windb SDL_VIDEODRIVER se omita en sistemas que no sean Windows. Yo sugeriría

 # [...] import platform if platform.system == "Windows": os.environ['SDL_VIDEODRIVER'] = 'windib' # [...] 

Aquí hay algunos enlaces.

  • Para incrustar en WxPython un artículo en pygame.org
  • Para incrustar en WxPython un artículo en la WxPython wiki
  • Para incrustar en Tkinter vea esta pregunta SO

Básicamente, hay muchos enfoques.

  • En Linux, puede embed fácilmente cualquier aplicación en un marco dentro de otro. Sencillo.
  • Salida de Pygame directo a un canvas de WkPython

Algunas investigaciones proporcionarán el código relevante.

Según las trazas, el progtwig se bloquea debido a TclErrors. Esto se debe a que intenta acceder al mismo archivo, socket o recurso similar en dos subprocesos diferentes al mismo tiempo. En este caso, creo que es un conflicto de recursos de pantalla dentro de los hilos. Sin embargo, esto no se debe, de hecho, a un problema interno que surge con dos progtwigs gui destinados a funcionar de manera autónoma. Los errores son producto de un hilo separado que llama root.update () cuando no es necesario porque el hilo principal se ha hecho cargo. Esto se detiene simplemente haciendo que el subproceso se llame root.update () solo cuando el subproceso principal no lo está haciendo.