Osadzanie okna Pygame w ramce Tkinter lub wxPython

Razem z przyjacielem tworzymy grę w pygame. Chcielibyśmy mieć okno pygame wbudowane w ramkę tkinter lub wxPython, abyśmy mogli zawierać wprowadzanie tekstu, przyciski i rozwijane menu, które są obsługiwane przez WX lub Tkinter. Przeszukałem internet w poszukiwaniu odpowiedzi, ale jedyne, co znalazłem, to ludzie zadający to samo pytanie, żadna z tych odpowiedzi nie została dobrze udzielona.

Jak najlepiej zaimplementować wyświetlacz pygame osadzony w ramce tkinter lub WX? (TKinter jest preferowany)

Każdy inny sposób, w jaki te funkcje mogą być dołączone do wyświetlacza pygame, również by zadziałał.

Author: AHuman, 2014-04-27

3 answers

Zgodnie z to więc pytanie i przyjęta odpowiedź, najprostszym sposobem, aby to zrobić, byłoby użycie ramki rysunkowej SDL.

Ten kod jest dziełem użytkownika SO 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()      

Ten kod jest wieloplatformowy, o ile linia windb SDL_VIDEODRIVER jest pomijana w systemach innych niż Windows. Proponuję

# [...]
import platform
if platform.system == "Windows":
    os.environ['SDL_VIDEODRIVER'] = 'windib'
# [...]
 14
Author: PythonNut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:04

Oto kilka linków.

Zasadniczo istnieje wiele podejść.
  • w Linuksie, możesz łatwo embed dowolna aplikacja w ramce wewnątrz innej. Proste.
  • [[6]}bezpośrednie wyjście Pygame do kanwy WkPython

Niektóre badania zapewnią odpowiedni kod.

 3
Author: PythonNut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:37

Zgodnie z traceback, program zawiesza się z powodu TclErrors. Są one spowodowane próbą uzyskania dostępu do tego samego pliku, gniazda lub podobnego zasobu w dwóch różnych wątkach w tym samym czasie. W tym przypadku uważam, że jest to konflikt zasobów ekranu w wątkach. Jednak w rzeczywistości nie jest to spowodowane wewnętrznym problemem, który pojawia się z dwoma programami gui, które mają działać autonomicznie. Błędy są produktem osobnego wątku wywołującego root.update() gdy nie jest potrzebna do ponieważ główny wątek przejął. Jest to zatrzymane po prostu przez wywołanie root wątku.update() tylko wtedy, gdy główny wątek tego nie robi.

 1
Author: someone-or-other,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-15 16:32:30