From: Sean D. <se...@tr...> - 2005-05-18 06:02:34
|
Alex,=20 =20 I figured out the first problem - I was only responding to on_*_mouseMove events, not on_*_mouseDrag. =20 With the second problem.. I need to use clear() so that I can drag primitives around the canvas (not draw with them like doodly.py does, but rather arrange their position). Eventually I'd like to use bitmaps for my nodes, but right now I'm just using drawRectangle() calls. =20 I put Freeze() and Thaw() around the code that renders the nodes at their positions: =20 def Render(self): if hasattr(self,"app"): self.components.GraphCanvas.Freeze() self.components.GraphCanvas.clear() for node in self.app.node_list: pos =3D node.pos self.components.GraphCanvas.drawRectangle(pos,(10,10)) self.components.GraphCanvas.Thaw() =20 Pretty simple stuff.. Except then I had the following interesting side-effects: =20 * Before I added the Freeze()/Thaw() pair, the on_*_mouseDrag event would only fire once for every mouse movement. Now it just rapidly fires once the button is down, without moving the mouse. * Whereas without Freeze()/Thaw() the interface blinks as I drag a node, with the pair, it doesn't update at all during dragging. I have verified that the above code is evaluating, though.. After I mouseUp, it draws everything, with a very noticable single blinking of the whole canvas which I assume is the buffer blit not being in sync? =20 So it appears these two problems are very interrelated.. My theory is that for some reason the mouseDrag event is firing uncontrollably, and because I redraw the canvas on each drag update, I get a bunch of recursive Freeze()/Thaw() calls that don't finish popping (and showing the buffer) until I release the mouse button. It smells like there might be a forced mouseDrag event firing in wx when Thaw() is called. Anyone have experience with this issue?=20 =20 I tried a really dumb workaround - before I call Freeze(), I set a class member (self.thawing) to True, and then when a mouseDrag fires, I check to see if self.thawing is true, and if it is, I set it to False and early return, else it updates some data and redraws the canvas: =20 def on_GraphCanvas_mouseDrag(self, event): if self.thawing: self.thawing =3D False return cur_pos =3D event.position if self.drag_mode and len(self.app.selected)>0: delta_pos =3D (cur_pos[0] - self.last_mouse_pos[0], = cur_pos[1] - self.last_mouse_pos[1]) self.app.AddRelativeNodePosition(self.app.selected, delta_pos) self.last_mouse_pos =3D cur_pos self.Render() =20 This seems to work, and I can drag my boxes around and it refreshes (and I totally realize this isn't thread safe)... The remaining problem being that I now get that sync blinking on every frame. So how do I stabilize the blit sync? Is the sync even the problem? =20 I would attach the full source/resource files in this email, but I'm not sure what the policies are on this list. Is that kind of think ok? =20 Thanks, Sean =20 =20 _____ =20 From: Alex Tweedly [mailto:al...@tw...]=20 Sent: Tuesday, May 17, 2005 3:23 PM To: Sean Dunn Cc: pyt...@li... Subject: Re: [Pythoncard-users] greedy events / double buffering? =20 Sean Dunn wrote:=20 I've been using PythonCard for simple interfaces for about a year now. Recently I decided to try something much more complex - implementing a custom interface inside a BitmapCanvas. There are two problems I'm facing at the moment: =20 * I can't seem to fire a mouseDown event without blocking mouseMove events until I get a mouseUp event. This basically means I can't click and drag something interactively inside the BitmapCanvas. There shouldn't be any problem doing this. Can you be more specific about the problem ? Or maybe look at the resourceEditor, which does this kind of thing in both mouseDown/mouseDrag and in doResize * I can't figure out how to double-buffer the BitmapCanvas. I'd like to do a clear() and then redraw my interface without causing the canvas to blink. Is there a way to do some kind of buffer toggling from inside PythonCard? =20 I think you should be able to get what you want from Freeze() and Thaw().=20 (though in general you ought to avoid clear() and redraw() if possible .... why do you need to do that ?) I'd much appreciate if anyone has some sage advice. =20 By the way, what I'm really trying to do is create a simple interface for creating node graphs: the kind you see in 2D graphics compositing programs/visual programming languages where you can arrange node operators and interconnect them to form a data flow. If anyone knows of a free Python (or even C++) API for doing this, let me know! =20 Don't know of one, sorry. There is something along those lines in the Object Graphic Library (part of wxPython) =3D- see the wxPython demo (under miscellaneous / OGL - night give you a start towards what you want. --=20 Alex Tweedly http://www.tweedly.net |