Встраивание окна Pygame в кадр Tkinter или WxPython

друг и я делаем игру в Pygame. Мы хотели бы иметь окно pygame, встроенное в кадр tkinter или WxPython, чтобы мы могли включать ввод текста, кнопки и раскрывающиеся меню, поддерживаемые WX или Tkinter. Я прочесал интернет в поисках ответа, но все, что я нашел, - это люди, задающие один и тот же вопрос, ни на один из них не было хорошего ответа.

Как лучше всего реализовать pygame-дисплей, встроенный в Tkinter или WX-фрейм? (TKinter является предпочтительно)

любой другой способ, которым эти функции могут быть включены вместе с дисплеем pygame, также будет работать.

3 ответов


По данным этой поэтому вопрос и принятый ответ, самый простой способ сделать это-использовать рамку рисования SDL.

этот код является работой SO user Алекс 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()      

этот код является кросс-платформенным, пока windb линия SDL_VIDEODRIVER опущен на системах Windows. Я бы предложил

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

вот некоторые ссылки.

В принципе, есть много подходов.

  • на Linux, вы можете легко embed любое приложение в кадре внутри другого. Простой.
  • Прямые, С Которым Pygame вывод на Wkpython Canvas

некоторые исследования предоставят соответствующий код.


согласно tracebacks, программа аварийно завершает работу из-за TclErrors. Они вызваны попыткой получить доступ к одному и тому же файлу, сокету или аналогичному ресурсу в двух разных потоках одновременно. В этом случае я считаю, что это конфликт ресурсов экрана в потоках. Однако это не связано с внутренней проблемой, которая возникает с двумя программами gui, которые предназначены для автономной работы. Ошибки являются продуктом отдельного потока, вызывающего root.update (), когда это не так надо потому что основная нить взяла верх. Это остановлено просто путем создания корневого вызова потока.update () только тогда, когда основной поток этого не делает.