[Pygui] Pixmap confusion

Colin Brown baykiwi at gmail.com
Tue Dec 14 09:08:24 CET 2010


Hi

My first hack at a Patch Panel application is progressing. To  
facilitate rapid screen redraw I planned to use
the Pixmap class. However I cannot understand how the same objects  
that are absolutely referenced to my
main Window and also written to the Pixmap, appear row inverted when  
retrieved from the Pixmap and
displayed alongside the main Window-written set?  The graphics  
positioning is upside down but the text
drawing in the Pixmap is rightside up.

Cheers
Colin Brown

Code on Mac OSX:


from GUI import Application, Document, Window, FileType, View, Frame,  
Pixmap
from GUI.StdColors import black, yellow, green
from GUI.Geometry import pt_in_rect

class myApp(Application):
   def __init__(self, title=None):
     Application.__init__(self, title=title)
     self.item_type = FileType(name="Item Document", suffix = 'patch')
     self.file_type = self.item_type
     self.pm = Pixmap(450,800)
   def open_app(self):
     self.new_cmd()
   def make_document(self, fileref):
     return ItemDoc(file_type = self.item_type)
   def make_window(self, document):
     win = Window(size=(950,800), title='Patch Panel',  
document=document)
     view = ItemView(model=document)
     win.place(view, left=0, top=0, right=0, bottom=0, sticky='nsew')
     win.show()
   def zero_windows_allowed(self):
     return

class ItemView(View, Frame):
   def __init__(self,*args, **kargs):
     View.__init__(self,*args, **kargs)
     for n in range(15):
       for m in range(8):
         self.model.add_item(Item((50*(m+1),50*(n+1)), '%03i' % (1+m 
+8*n,)))
   def draw(self, canvas, update_rect):
     canvas.fillcolor = yellow
     canvas.pencolor = black
     for item in self.model.items:
       item.draw(canvas)
     A.pm.draw(canvas,(0,0,450,800),(500,0,950,800))
   def mouse_move(self, ev):
     print self.model.onItem(ev.position)

class ItemDoc(Document):
   def new_contents(self):
     self.items = []
   def add_item(self, item):
     self.changed()
     self.notify_views('item_changed', item)
     self.items.append(item)
     item.setpm(1)
     A.pm.with_canvas(item.draw)
     item.setpm(0)
   def onItem(self, xy):
     for n in range(len(self.items)):
       if self.items[n].contains(xy):
         return n+1
     return 0

class Item:
   def __init__(self, c, t):
     self.centre = c
     self.rect, self.text = (c[0]-20,c[1]-20,c[0]+20,c[1]+20), t
     self.pm = 0
   def contains(self, xy):
     return pt_in_rect(xy, self.rect)
   def setpm(self,state):
     self.pm = state
   def draw(self, canvas):
     if self.pm:
       canvas.fillcolor = green
       canvas.pencolor = black
     else:
       canvas.fillcolor = yellow
     l,t,r,b = self.rect
     canvas.newpath()
     canvas.moveto(l,t)
     canvas.lineto(r,t)
     canvas.lineto(r,b)
     canvas.lineto((r+l)/2,b+3) # Help debug pixmap drawing problem
     canvas.lineto(l,b)
     canvas.closepath()
     canvas.fill_stroke()
     canvas.moveto(l+9,t+24)
     canvas.show_text(self.text)

A = myApp('Patch Panel')
A.run()



More information about the Pygui mailing list