On Sun, Sep 9, 2012 at 5:58 PM, Greg Nielsen <gollumgreg407...@gmail.com> wrote: > Hello Tutor, > > Quick question. Working on a new game and want to build in a GUI. > TkInter seems to fit the bill except for one small item. Both Pygame and > TkInter create windows. (Screen in Pygame, and the Root widget in TkInter) > Is there a way to combined these two so I can use all my Pygame sprites and > objects and any TkInter bars and buttons all in one screen? My best guess > would be something along this line.
I found this answer on Stack Overflow: http://stackoverflow.com/questions/8584272/using-pygame-features-in-tkinter It depends on initializing the SDL engine to use the window ID from a Tk frame, based on the 'SDL_WINDOWID' environment variable. I added a check of sys.platform == "win32" for the suggested use of 'SDL_VIDEODRIVER' on Windows, but I haven't verified that this is required or that it works. Instead of a while loop that manually pumps both SDL and Tk, I switched to using the Tk mainloop. The frame's "after" method is used to run pygame_loop every 5 ms, which updates the screen. You'll have to experiment with how this affects pygame's ability to grab keyboard/click events. You might have to use Tk for input instead. Just to show the event loop in action, I added two buttons to increment/decrement the current step size, tied to the incr_step method. import sys import os import Tkinter as tkinter import pygame class Game(object): def __init__(self, root, w, h): self.root = root self.width = w self.height = h # Tk init self.frame = tkinter.Frame(root, width=w, height=h) self.frame.grid(row=0, columnspan=2) self.button1 = tkinter.Button( root, text='-', command=lambda: self.incr_step(-1)) self.button1.grid(row=1, column=0) self.button2 = tkinter.Button( root, text='+', command=lambda: self.incr_step(1)) self.button2.grid(row=1, column=1) root.update() # pygame init os.environ['SDL_WINDOWID'] = str(self.frame.winfo_id()) if sys.platform == "win32": os.environ['SDL_VIDEODRIVER'] = 'windib' pygame.display.init() self.screen = pygame.display.set_mode((w, h)) self.bg_color = pygame.Color(0,0,0) self.fg_color = pygame.Color(255,255,255) self.position = 0 self.step = 1 self.game_loop() def game_loop(self): self.screen.fill(self.bg_color) self.position = (self.position + self.step) % self.width coord = self.position, self.height // 2 pygame.draw.circle(self.screen, self.fg_color, coord, 20) pygame.display.flip() self.frame.after(5, self.game_loop) def incr_step(self, inc): self.step += inc if __name__ == "__main__": root = tkinter.Tk() game = Game(root, 200, 200) root.mainloop() _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor