[python-nl] Tekenen op een achtergrond bitmap met wx.DC

Stani spe.stani.be at gmail.com
Thu Oct 2 18:04:33 CEST 2008


Beste Udder,

Ik raad je sterk aan dit soort vragen te stellen op de wxpython-user
mailing lijst. Daar zal je meer feedback krijgen dan hier.
Eerste opmerking is dat je nooit een referentie naar een dc mag opslaan.
Dus self.canvas_dc is uit den boze. Een device context moet je
doorspelen als argument van een andere methode of opvragen  met
wx.ClientDC(self). Als je dit niet doet wordt het behoorlijk
onvoorspelbaar wat er gaat gebeuren.

Ten tweede kan je het beste je panel tekenen vanuit een
wx.EVT_ERASE_BACKGROUND handler:

self.Bind(wx.EVT_ERASE_BACKGROUND,self.OnEraseBackground)

Met OnEraseBackground method teken je dan vervolgens de basisafbeelding.

Voor een voorbeeld zie de Mixin die ik hiervoor geschreven heb voor
Phatch:

http://bazaar.launchpad.net/~stani/phatch/dev/annotate/540?file_id=paint.py-20080117003711-1714wor62cxaip1y-1

Dit is bijvoorbeeld het resultaat (met onderliggende afgeronde
rechthoek):
http://seanja.com/blog/wp-content/phatch-running.png

Er zit ook een standalone test bij die je dus kan laten lopen door
"python paint.py" te runnen.

Groeten,
Stani

Op donderdag 02-10-2008 om 08:11 uur [tijdzone -0700], schreef Udder: 
> Hallo iedereen, 
> 
> Ik probeer een tekst te 'tekenen' op een bestaande bitmap die als
> achtergrond fungeert voor een canvas. Het probleem is dat ik de bitmap niet
> zie als ik de applicatie start, maar wel wanneer ik begin met schrijven van
> tekst. Het schrijven van de tekst gaat  dan ook zonder problemen. Dit
> gebeurt dan in een mouse-down event-handler.  Hier beneden de bewuste code.
> Het betreft hier een paneel dat weer child is van een notebook pagina.
> Iedereen alvast bedankt!
> 
> ==============================
> import wx
> 
> class paneel(wx.Panel):
>     def __init__(self, parent, id):
>         wx.Panel.__init__(self, parent, id,
> style=wx.WS_EX_PROCESS_UI_UPDATES )
>         image_file = 'bitmaps/voeten.bmp'
>         self.image = wx.Bitmap(image_file)
>         self.canvas_dc = wx.ClientDC(self)                 
>         # the image is now the background for the canvas
>         self.canvas_dc.DrawBitmap(self.image, 0, 0, 0)
>         self.Bind(wx.EVT_LEFT_DOWN, self.OnMotion)        
> 
>     def OnMotion(self, event):
>         x, y = event.GetPosition()
>         self.DrawText(x, y)
> 
>     def DrawText(self, a, b):
>         dc = wx.MemoryDC(self.image)
>         dc.DrawText("Sweet Roses!", x=a, y=b)
>         self.canvas_dc.Blit(0,0,553,521,dc,0,0)
> ===============================



More information about the Python-nl mailing list