2011-03-14 4 views
0

pygameとTkを統合する方法を知っている人はいますか?私はTk形式でパイゲームディスプレイを運転しようとしており、私は困難を抱えています。以下は私が達成しようとしているものの簡単な例です。私は、pygameウィンドウのアクションをトリガーするためにTkフォームから入力を取得しようとしています。私はどのように基本的な相互作用を乗り越えるか分からない。いずれかの人がこのタイプのことをしましたか?助言?pygameとtkを統合する

# 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(): 
+0

あなたが(DEFメイン 'の体を欠場するようです):。。' – Ikke

答えて

0

あなたはPyToolkitを見ましたか?あなたが探している橋のように見えます。うーん、いや、以外、ダウンロードリンクは死んで:-(

1

ある私はこれを試してみた。主なアイデアは、root.after(miliseconds, call_back)を使用してタイマーイベントを設定することです。これは、あなたのTkのプログラムでpygameの部分をtirggerます。

ここで

は一例です

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() 

ボタンをクリックし、pygameのウィンドウがあなたを反応する

関連する問題