Solved, thanks a lot !

2014-03-05 0:01 GMT+01:00 Chris Barker <[email protected]>:

> On Tue, Mar 4, 2014 at 1:05 PM, Nouvelle Collection <
> [email protected]> wrote:
>
>
>>  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)
>>
>> ...
>
>> But if I manually resize the window that hosts the Canvas, then the
>> Canvas is redrawn, and the new Image appears.
>
>
> Odd -- the True passed in to Draw() should force a re-draw.
>
> Got it -- ScaledBitmap caches the re-scaled Image, so that it doesn't need
> to re-scale it at every draw -- only when the zoom is changed. That why a
> Window re-size did it.
>
> Try:
>
> myelt.Image = .... # new image
> myelt.ScaledBitmap = None
>
> That will clear the cached Image.
>
> I suppose I should make self.Image a property, so that that would happen
> fo ryou. But teh multi-image solution is better anyway.
>
> -Chris
>
>
>
>
>
>> etc., the new image is not (re)drawn.
>>
>>
>> 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
>>
>>
>
>
> --
>
> 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