Вложение окна Pygame в рамку Tkinter или WxPython

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

Каким будет лучший способ реализации отображения pygame, встроенного в кадр tkinter или WX? (Предпочтительнее TKinter)

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

Ответ 1

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

Этот код - это работа пользователя 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()      

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

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

Ответ 2

Вот несколько ссылок.

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

  • В Linux вы можете легко embed использовать любое приложение в кадре внутри другого. Простой.
  • Прямой вывод Pygame на холст WkPython

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

Ответ 3

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