[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] gui with pygame + pyopengl



Hi,
Thanks for the suggestion and Im trying it out with pgu. Now Im having problems with the pgu interface. Can anyone help me?
I've attached my test code. Its basically a button or event that brings up a text entry dialog. So far its fine, as soon as the dialog is closed, it wont close. Any ideas?
Cheers
Stan

René Dudfield wrote:
hi,

Lamina allows you to use any pygame 2d gui with opengl.
http://pitchersduel.python-hosting.com/browser/branches/Lamina/

It's fairly easy to use, and comes with demos for ocempgui and pgu.

cheers,



On Wed, Jun 18, 2008 at 2:58 PM, Astan Chee <stanc@xxxxxxxxx> wrote:
  
Hi,
I was wondering if there is a way to get a simple text entry dialog on a
pygame+opengl surface. I've tried several and all of them seem to dislike
doing a .blit on a opengl surface and crash badly whenever I do anything on
it. Are there simple alternatives?
Thanks
Astan

--
"Formulations of number theory: Complete, Consistent, Non-trivial. Choose
two."


Animal Logic
http://www.animallogic.com

Please think of the environment before printing this email.

This email and any attachments may be confidential and/or privileged. If you
are not the intended recipient of this email, you must not disclose or use
the information contained in it. Please notify the sender immediately and
delete this document if you have received it in error. We do not guarantee
this email is error or virus free.




    

  

-- 
"Formulations of number theory: Complete, Consistent, Non-trivial. Choose two."

Please think of the environment before printing this email.

This email and any attachments may be confidential and/or privileged. If you are not the intended recipient of this email, you must not disclose or use the information
contained in it. Please notify the sender immediately and delete this document if you have received it in error. We do not guarantee this email is error or virus free.

#!/usr/bin/env python
# demo of laminar.PanelOverlaySurface, by
#  David Keeney 2006
# based on version of Nehe's OpenGL lesson04
#  by Paul Furber 2001 - m@xxxxxxxxxxxx

# you need pgu to be installed, and you need a copy of the default theme directory
#   as 'test_theme', and you need the accompanying config.txt in that test_theme dir.

import sys
sys.path.insert( 0, '..' )

from OpenGL.GL import *
from OpenGL.GLU import *
import pygame
from pygame.locals import *

# import gui stuff
try:
    from pgu import gui as pgui
except ImportError:
    print "PGU GUI must be installed in order to run this demo. "
    print "PGU can be obtained from: "
    print " https://sourceforge.net/project/showfiles.php?group_id=145281";
    sys.exit()

import lamina

rtri = rquad = 0.0

triOn = quadOn = True
zoomAngle = 45
open_d = None

class OpenDialog(pgui.Dialog):
    def __init__(self,**params):
        title = pgui.Label("Input Position")
        
        t = pgui.Table()
        
        self.value = pgui.Form()
        
        t.tr()
        t.td(pgui.Label("Position: "))
        t.td(pgui.Input(name="pos"),colspan=3)
        
        t.tr()
        e = pgui.Button("Ok")
        e.connect(pgui.CLICK,self.send,pgui.CHANGE)
        t.td(e,colspan=2)
        
        e = pgui.Button("Cancel")
        e.connect(pgui.CLICK,self.close,None)
        t.td(e,colspan=2)
        
        pgui.Dialog.__init__(self,title,t)
    
def resize((width, height)):
    if height==0:
        height=1
    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(zoomAngle, 1.0*width/height, 0.1, 100.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def init():
    glShadeModel(GL_SMOOTH)
    glClearColor(0.0, 0.5, 0.0, 0.0)
    glClearDepth(1.0)
    glEnable(GL_DEPTH_TEST)
    glDepthFunc(GL_LEQUAL)
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

def draw():

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glTranslatef(-1.5, 0.0, -6.0)

    # draw triangle
    global rtri
    glRotatef(rtri, 0.0, 1.0, 0.0)

    glBegin(GL_TRIANGLES)
    glColor3f(1.0, 0.0, 0.0)
    glVertex3f(0.0, 1.0, 0.0)
    glColor3f(0.0, 1.0, 0.0)
    glVertex3f(-1.0, -1.0, 0)
    glColor3f(0.0, 0.0, 1.0)
    glVertex3f(1.0, -1.0, 0)
    glEnd()

    # draw quad
    glLoadIdentity()
    glTranslatef(1.5, 0.0, -6.0)
    global rquad
    glRotatef(rquad, 1.0, 0.0, 0.0)

    glColor3f(0.5, 0.5, 1.0)
    glBegin(GL_QUADS)
    glVertex3f(-1.0, 1.0, 0)
    glVertex3f(1.0, 1.0, 0)
    glVertex3f(1.0, -1.0, 0)
    glVertex3f(-1.0, -1.0, 0)
    glEnd()

    # draw gui
    glLoadIdentity()
    global gui_screen
    gui_screen.display()


def main():

    global rtri, rquad, gui_screen, open_d
    video_flags = OPENGL|DOUBLEBUF
    
    pygame.init()
    pygame.display.set_mode((640,480), video_flags)
    font = pygame.font.SysFont("default", 18)
    fontBig = pygame.font.SysFont("default", 24)
    fontSub = pygame.font.SysFont("default", 20)
    theme = pgui.Theme('test_theme');

    resize((640,480))
    init()


    # create PanelOverlaySurface
#    gui_screen = lamina.LaminaPanelSurface((640,480), (-3.3, 2.5, 6.6, 5))
    gui_screen = lamina.LaminaScreenSurface()

    gui = pgui.App(theme=theme)
    gui._screen = gui_screen.surf

    # func to toggle triangle spin
    def triTog():
        global triOn
        triOn = not triOn
    # func to toggle quad spin
    def quadTog():
        global quadOn
        quadOn = not quadOn
    # func to toggle zoom
    def zoomTog():
        global zoomAngle
        if zoomAngle == 45:
            zoomAngle = 30
        else:
            zoomAngle = 45
        resize((640,480))
        gui_screen.refreshPosition()
        gui.repaint(gui_screen.surf)

    def action_open(meme):
        global open_d
        open_d.close()
        fname = open_d.value['pos']
        print fname.value

    # create page    # layout using document
    lo = pgui.Container(width=640) 

    # create page label
    title = pgui.Label("Lamina Demo : PGU", font=fontBig) 
    lo.add(title,29,13)
    
    # create triangle button, connect to triTog handler function,
    #  and install in gui
    btn1 = pgui.Button("Stop/Start Triangle")
    btn1.connect(pgui.CLICK, triTog)
    lo.add(btn1,120,440)
    btn2 = pgui.Button("Stop/Start Quad")
    btn2.connect(pgui.CLICK, quadTog)
    lo.add(btn2,420,440)
    # create zoom button, connect to zoomTog handler function,
    #  and install in gui    
    btn3 = pgui.Button('Zoom')
    btn3.connect(pgui.CLICK, zoomTog)
    lo.add(btn3,300,440)

    open_d = OpenDialog()
    open_d.connect(pgui.CHANGE,action_open,None)
    
    btn4 = pgui.Button('Ask')
    btn4.connect(pgui.CLICK, open_d.open)
    lo.add(btn4,300,240)
    gui.init(lo)

    frames = 0
    ticks = pygame.time.get_ticks()
    while 1:
        event = pygame.event.poll()
        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            break
        
        # handle gui events and raster updating
        gui.event((event))
        
        chg = gui.update(gui_screen.surf)
        if chg:
            gui_screen.refresh(chg)
        
        # draw all objects
        draw()
        
        # update rotation counters
        if triOn:
            rtri += 0.2
        if quadOn:
            rquad+= 0.2

        # make changes visible
        pygame.display.flip()
        frames = frames+1

    print "fps:  %d" % ((frames*1000)/(pygame.time.get_ticks()-ticks))
    pygame.quit()


if __name__ == '__main__': main()