#!/usr/bin/env python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2022/08/06 09:29:13 +0900> """ test embed pygame window on tkinter. Windows10 x64 21H2 + Python 2.7.18 32bit + pygame 1.9.6 + tkinter """ try: import Tkinter as tk except ModuleNotFoundError: import tkinter as tk import os import sys import platform w, h = 640, 360 x, y = (w / 2), (h / 2) dx = float(w) / (60 * 1.0) dy = float(h) / (60 * 1.5) def update_pygame_window(): global x, y, dx, dy, screen, root w = screen.get_width() h = screen.get_height() x += dx y += dy r = 24 if x <= r or x >= w - r: dx *= -1 if y <= r or y >= h - r: dy *= -1 # draw pygame window screen.fill(pygame.Color(20, 80, 160)) pygame.draw.circle(screen, pygame.Color(255, 0, 0), (int(x), int(y)), r) # Update the pygame display pygame.display.flip() root.after(16, update_pygame_window) def reset_pos(): global x, y, w, h x, y = (w / 2), (h / 2) # init tkinter widget root = tk.Tk() root.title("Embed pygame window in tkinter") embed = tk.Frame(root, width=w, height=h) embed.pack() btn = tk.Button(root, text="Reset Position", command=reset_pos) btn.pack() root.update() root.update_idletasks() # set SDL environ hwnd = embed.winfo_id() os.environ['SDL_WINDOWID'] = str(hwnd) if platform.system() == "Windows": # Windows os.environ['SDL_VIDEODRIVER'] = 'windib' # get window size (Windows only) import win32gui rect = win32gui.GetWindowRect(hwnd) x0, y0, x1, y1 = rect[0], rect[1], rect[2], rect[3] frm_size = ((x1 - x0), (y1 - y0)) print("size : %d x %d" % frm_size) else: # Linux or Darwin os.environ['SDL_VIDEODRIVER'] = 'x11' # init pygame import pygame pygame.display.init() # get tkinter.widget size frm_w = embed.winfo_width() frm_h = embed.winfo_height() # print("frame size : %d x %d" % (frm_w, frm_h)) screen = pygame.display.set_mode((frm_w, frm_h)) # screen = pygame.display.set_mode((0, 0)) update_pygame_window() root.mainloop() # tkinter main loop pygame.quit() sys.exit()