Update: the radio buttons and toggle-buttons have been improved. They now use the SIG_TOGGLE signal instead of SIG_CLICK for better results. # As part of the Pitcher's Duel Project, I am conducting a comparative # analysis of pygame GUI modules, and publishing the results on my blog. # The comparison consists of implementing the same sample interface on # each of the various GUIs. # # This code implements the interface using the Ocemp GUI library. For # details on this library, see: # http://ocemp.sourceforge.net/guidoc.html # # The module author is: Marcus von Appen # # This source code is the work of David Keeney, dkeeney at travelbyroad dot net #Import Modules import pygame from pygame.locals import * import time import math # import gui stuff from ocempgui.widgets import * from ocempgui.widgets.components import TextListItem from ocempgui.widgets.Constants import * screenSize = (642, 429) # define the necessary callback functions. # these are connected to signals within their respective # widgets, and invoked by the gui # def logAction(ed, text): """ add the text to the 'edit' window (callback function)""" ed.items.append(TextListItem(text)) def logButtonAction(ed, btn, text): """ add the button status to the 'edit' window (callback function)""" if btn.active: text += ' selected' else: text += ' deselected' #text += str(btn.active) ed.items.append(TextListItem(text)) def logTextAction(ed, txtWidget): """ add the text to the 'edit' window (callback function)""" text = txtWidget.text ed.items.append(TextListItem(text)) def logSlider(ed, slider): """ add the slider position to the 'edit' window (callback function)""" #text = str(slider.get_coords_from_value()) text = 'Slider is at ' + str(int(slider.value)) + ' %' ed.items.append(TextListItem(text)) def progBar(pb, list): """ update progress bar for len of list (callback function)""" prog = len(list) / 20.0 * 100 if prog > 100: prog = 100 pb.set_value(prog) # the body of the program is here # def main(): """this function is called when the program starts. it initializes everything it needs, then runs in a loop until the function returns.""" #Initialize Everything pygame.init() screen = pygame.display.set_mode(screenSize) pygame.display.set_caption('GUI Test - Ocemp') # create GUI object gui = Renderer() gui.screen = screen # create page label lbl = Label('Pygame GUI Test Page - Ocemp') lbl.position = 29, 13 gui.add_widget(lbl) # create progress bar label lbl4 = Label('Progress Bar') lbl4.position = 356, 355 gui.add_widget(lbl4) # progress bar pb = ProgressBar() pb.position = 354, 376 gui.add_widget(pb) # create edit box ed = ScrolledList(250, 320) ed.scrolling = SCROLL_ALWAYS ed.items.append(TextListItem('top line of input')) ed.items.append(TextListItem('second line of input')) ed.position = 367, 19 gui.add_widget(ed) progBar(pb, ed.items) # update progress bar for above two items ed.connect_signal (SIG_LISTCHANGE, progBar, pb, ed.items) # create checkbuttons and add to gui cb1 = CheckButton ('Check Box #1') cb1.position = 52, 40 cb1.connect_signal (SIG_CLICKED, logButtonAction, ed, cb1, 'Check Box #1 clicked') gui.add_widget(cb1) cb2 = CheckButton ('Check Box #2') cb2.position = 52, 70 cb2.connect_signal (SIG_CLICKED, logButtonAction, ed, cb2, 'Check Box #2 clicked') gui.add_widget(cb2) cb3 = CheckButton ('Check Box #3') cb3.position = 52, 98 cb3.connect_signal (SIG_CLICKED, logButtonAction, ed, cb3, 'Check Box #3 clicked') gui.add_widget(cb3) # create radio buttons, put in table, and add to gui rbTab = Table(3,1) rbTab.position = 210, 40 rb1 = RadioButton('Radio Button #1', None) rb1.connect_signal (SIG_TOGGLED, logButtonAction, ed, rb1, 'Radio Button #1 ') rbTab.add_child(0, 0, rb1) rb2 = RadioButton('Radio Button #2', rb1) rb2.connect_signal (SIG_TOGGLED, logButtonAction, ed, rb2, 'Radio Button #2 ') rbTab.add_child(1, 0, rb2) rb3 = RadioButton('Radio Button #3', rb1) rb3.connect_signal (SIG_TOGGLED, logButtonAction, ed, rb3, 'Radio Button #3 ') rbTab.add_child(2, 0, rb3) gui.add_widget(rbTab) # create txt box label lbl2 = Label('Text Box') lbl2.position = 31, 130 gui.add_widget(lbl2) # create text box en = Entry() en.position = 31, 155 en.size = 250, 21 en.connect_signal (SIG_INPUT, logTextAction, ed, en) gui.add_widget(en) # create slider label lbl3 = Label('Slider') lbl3.position = 31, 190 gui.add_widget(lbl3) # create slider sl = HScale(0, 100, 1) sl.position = 31, 215 sl.size = 200, 20 sl.connect_signal (SIG_MOUSEUP, logSlider, ed, sl) gui.add_widget(sl) # add buttons, both regular and toggle btnTab = Table(2, 3) btnTab.position = 30, 250 btnTab.spacing = 10 btn1 = Button('Button 1') btn1.connect_signal (SIG_CLICKED, logAction, ed, 'Button 1 clicked') btnTab.add_child(0, 0, btn1) btn2 = Button('Button 2') btn2.connect_signal (SIG_CLICKED, logAction, ed, 'Button 2 clicked') btnTab.add_child(0, 1, btn2) btn3 = Button('Button 3') btn3.connect_signal (SIG_CLICKED, logAction, ed, 'Button 3 clicked') btnTab.add_child(0, 2, btn3) btnA = ToggleButton('Button A') btnA.connect_signal (SIG_TOGGLED, logButtonAction, ed, btnA, 'Button A ') btnTab.add_child(1, 0, btnA) btnB = ToggleButton('Button B') btnB.connect_signal (SIG_TOGGLED, logButtonAction, ed, btnB, 'Button B ') btnTab.add_child(1, 1, btnB) btnC = ToggleButton('Button C') btnC.connect_signal (SIG_TOGGLED, logButtonAction, ed, btnC, 'Button C ') btnTab.add_child(1, 2, btnC) gui.add_widget(btnTab) # create 'not implemented' label for image map lbl4 = Label('Image Map Not Implementable') lbl4.position = 31, 340 gui.add_widget(lbl4) # make some insensitive btn2.sensitive = False cb3.sensitive = False #Main Loop while 1: #Handle Input Events for event in pygame.event.get(): if event.type == QUIT: return elif event.type == KEYDOWN and event.key == K_ESCAPE: return # pass event to gui gui.distribute_events((event)) # clear background, and draw clock-spinner screen.fill((250, 250, 250)) radius = 30 spinPos = 240, 362 sp2 = spinPos[0]+1, spinPos[1] progressAngle = int(time.time() % 15 * 24 - 90) #60 pygame.draw.circle(screen, (180, 180, 180), spinPos, radius, 0) for angle in range(-90, progressAngle): a = angle*math.pi/180 tgt = radius*math.cos(a)+spinPos[0], \ radius*math.sin(a)+spinPos[1] pygame.draw.line(screen, (254,254,254), spinPos, tgt, 2) pygame.draw.circle(screen, (0,0,0), spinPos, radius, 2) pygame.draw.circle(screen, (0,0,0), spinPos, radius+1, 3) pygame.draw.circle(screen, (0,0,0), sp2, radius, 2) pygame.draw.circle(screen, (0,0,0), sp2, radius+1, 3) pygame.draw.line(screen, (0,0,0), spinPos, tgt, 2) tgt = spinPos[0], spinPos[1]-radius pygame.draw.line(screen, (0,0,0), spinPos, tgt, 2) # Draw GUI gui.update() gui.draw(gui.screen) pygame.display.flip() main()
16 October 2005
13 June 2007 at 11:54 am
[…] Ocemp GUI Example Updated (code) Ocemp GUI Example (code) […]