Python Интеграция Pygame и TK - PullRequest
0 голосов
/ 14 марта 2011

Кто-нибудь знает, как интегрировать pygame с Tk?Я пытаюсь управлять дисплеем Pygame с формой Tk, и у меня возникают трудности.Ниже приведен простой пример того, чего я пытаюсь достичь.Я пытаюсь получить ввод из формы Tk для запуска действия в окне Pygame.Я не уверен, как пройти основное взаимодействие.Кто-нибудь делал такие вещи?совет?

# The following code has 2 major problems.
#  1.  The window does not refresh when it is dragged over the pygame field.
#  2.  How to plot variables on the screen when the 'Draw' button is clicked?

from Tkinter import *
import os, sys, pygame
from pygame.locals import *

pygame.init()

size = width, height = 1200, 800 
CENTER = width/2, height/2

class Application(Frame):

    def draw_circle(self):
        print "How do I draw a circle at (x,y) radius?"
        print "Does this code belong here?"

    def createWidgets(self):
        myXFrame = Frame(self, bd=2, relief=RIDGE)
        Label(myXFrame, text='X:').pack(side=LEFT, padx=5)
        myX = StringVar()
        Entry(myXFrame, textvariable=myX, bg='white').pack(side=RIGHT, padx=5)
        myX.set('X')
        myXFrame.pack(expand=1, fill=X, pady=10, padx=5)

        myYFrame = Frame(self, bd=2, relief=RIDGE)
        Label(myYFrame, text='Y:').pack(side=LEFT, padx=5)
        myY = StringVar()
        Entry(myYFrame, textvariable=myY, bg='white').pack(side=RIGHT, padx=5)
        myY.set('Y')
        myYFrame.pack(expand=1, fill=X, pady=10, padx=5)

        radiusFrame = Frame(self, bd=2, relief=RIDGE)
        Label(radiusFrame, text='Radius:').pack(side=LEFT, padx=5)
        radius = StringVar()
        Entry(radiusFrame, textvariable=radius, bg='white').pack(side=RIGHT, padx=5)
        radius.set('radius')
        radiusFrame.pack(expand=1, fill=X, pady=10, padx=5)

        self.DRAW = Button(self)
        self.DRAW["text"] = "DRAW"
        self.DRAW["fg"]   = "red"
        self.DRAW["command"] =  self.draw_circle 
        self.DRAW.pack({"side": "left"})

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

def main():

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Я пробовал это. Основная идея состоит в том, чтобы установить событие таймера, используя root.after(miliseconds, call_back). Это повлияет на роль пигмея в вашей программе Tk.

Вот пример.

import pygame
import Tkinter as tk
from random import randint
class MyGame:
    def __init__(self):
        self.root = tk.Tk()
        tk.Button(self.root, text='Click Me', command=self.add_point).pack()

        pygame.display.init()
        self.screen = pygame.display.set_mode((200, 200))
        self.screen.fill(0xffffff)
        pygame.display.flip()

        self.cnt = 0

    def add_point(self, r=20):
        pygame.draw.circle(self.screen, randint(0, 0xffffff), 
                (randint(10, 190), randint(10, 190)), r)
        pygame.display.flip()

    def loop(self):
        # do logic
        # do render
        self.cnt += 1
        if self.cnt % 10 == 0:
            self.add_point(3)
        self.root.after(5, self.loop)

    def mainloop(self):
        self.root.after(5, self.loop)
        self.root.mainloop()

MyGame().mainloop()

Нажмите на кнопку, и окно с игрой будет реагировать на вас.

0 голосов
/ 01 декабря 2011

Вы смотрели на PyToolkit ? Похоже, мост, который вы ищете. Хм, кроме, нет, ссылки для скачивания мертвы: - (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...