Hi Chris,

Thanks for these tips, I am going to implement it that way. I will share
the results when ready !
When changing Image :

myelt.Image = .... # new image

even if I do  :

self.Canvas.Draw(True)
wx.CallAfter(self.Canvas.ZoomToBB)

etc., the new image is not (re)drawn.

But if I manually resize the window that hosts the Canvas, then the Canvas
is redrawn, and the new Image appears.

How to manually ask for a redrawing of the Image, just afer
myelt.Image = .... # new image
?

Thank you in advance,

Jo


2014-03-04 18:42 GMT+01:00 Chris Barker <[email protected]>:

> On Tue, Mar 4, 2014 at 9:17 AM, Nouvelle Collection <
> [email protected]> wrote:
>
>>  Hello,
>> (This is my last question for the week, sorry for all these mails).
>>
>> I would like to change the image of a ScaledBitmap when clicking on it :
>>
>> A = self.Canvas.AddScaledBitmap(img, (0,0), Height=img.GetHeight(),
>> Position = 'tl')
>> A.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.OnDown)
>>
>> def OnDown(self, elt):
>>     # ...
>>     # Change A's image to another bitmap
>>
>> *The goal is to make a ToggleButton : each click on the button would
>> toggle between img1 and img2.*
>>
>> Remark : I already implemented it by doing :
>> A_enabled = self.Canvas.AddScaledBitmap(img_ena, (0,0),
>> Height=img_ena.GetHeight(), Position = 'tl')
>> A_disabled = self.Canvas.AddScaledBitmap(img_dis, (0,0),
>> Height=img_dis.GetHeight(), Position = 'tl')
>> and then each click on both of them would *hide one of them, and show
>> the other*...
>> But this is a kind of dirty way to do it...
>>
>
> Well, that's not so bad....
>
> But the semi-"right" way to do it would be to change the Image in place:
>
> def OnDown(self, elt):
>     # ...
>     # Change A's image to another bitmap
>           elt.Image = the_new_image
>
> This should "just work", but only if:
>    the_new_image is a wx.Image object
>    it is the same size as the previous image.
>
>
> But the "right" way to do it is to make a ScaledBitmap that stored two
> images. You could subclass ScaledBitmap:
>
> class ToggleScaledBitmap(FloatCanvas.ScaledBitmap):
>     def__init__(self, Bitmap1, Bitmap2, *args, **kwargs):
>
>         if type(Bitmap1) == wx._gdi.Bitmap:
>             self.Image1 = Bitmap1.ConvertToImage()
>         elif type(Bitmap) == wx._core.Image:
>             self.Image1 = Bitmap1
>         ## repeated code -- should be cleaned up...
>         if type(Bitmap2) == wx._gdi.Bitmap:
>             self.Image2 = Bitmap1.ConvertToImage()
>         elif type(Bitmap) == wx._core.Image:
>             self.Image2 = Bitmap2
>
>        ## some checks in here to make sure that the two bitmaps are the
> same size...
>
>         FloatCanvas.ScaledBitmap.__init__(self, self.Image1, *args,
> **kwargs)
>
>     def ChangeBitmap(self, bitmap_num=1):
>         if bitmap_num == 1:
>             self.Image = self.Image1
>         elif bitmap_num == 2:
>             self.Image = self.Image2
>         else:
>             raise ValueError("bitmap_num ust be either 1 or 2")
>
> All untested....
>
> Better yet, make it a MultiScaledBitmap, and allow the user to pass in a
> list of Images of any length, and switch between them.
>
> This would be nice to add to FloatCanvas once you get it working....
>
> -Chris
>
>
>
>
> --
>
> Christopher Barker, Ph.D.
> Oceanographer
>
> Emergency Response Division
> NOAA/NOS/OR&R            (206) 526-6959   voice
> 7600 Sand Point Way NE   (206) 526-6329   fax
> Seattle, WA  98115       (206) 526-6317   main reception
>
> [email protected]
>
> _______________________________________________
> FloatCanvas mailing list
> [email protected]
> http://mailman.paulmcnett.com/cgi-bin/mailman/listinfo/floatcanvas
>
>
_______________________________________________
FloatCanvas mailing list
[email protected]
http://mailman.paulmcnett.com/cgi-bin/mailman/listinfo/floatcanvas

Reply via email to