wx.lib.ogl ShapeCanvas question

Posted on 2009-04-13
Last Modified: 2013-12-06
How can I find out what shape on the shape canvas is currently selected?

I had a look at the API ( but it doesn't seem to have any method like GetSelectedShape.

I know that Shape has a method called Selected which returns True if a shape is selected. So I could possible do something like:
1. create a shape on the canvas
2. add it to a global array of created shapes
3. iterate through this array to see for which shape Selected returns true and return this shape

But is there a better way of doing things?

The reason I ask is because in my frame is defined a method which is a method that appears on the pop up menu when a shape is right clicked and I need this method to be able to access the shape that was right clicked....I can't find a way to pass along the information about what shape was selected from my Event Handler's OnRightClick method to the frame.PopupMenu(frame.shape_menu) to the frame's self.Bind(wx.EVT_MENU, self.OnAddChild, id=1000) such that I can pass the shape as a parameter in def OnAddChild(self, event). I don't even know if this is something that can/should be done.

Phew! If that explanation sounded crazy please have a look at the relevant bits of code I attached for your perusal :)

Can anyone advise on what would be the best way to solve my issue?

import wx
import wx.lib.ogl as ogl
class MyEvtHandler(ogl.ShapeEvtHandler):
        def OnRightClick(self, x, y, *dontcare): #*dontcare
            self.OnLeftClick(x, y, 0, 0)
            shape = self.GetShape()
            canvas = shape.GetCanvas()
            frame = canvas.GetFrame()
class OGLCanvas(ogl.ShapeCanvas):
      [SNIPPED FOR CLARITY]        
      #This is where I want to define the method that returns the shape current
      # selected by the mouse
       def GetSelectedShape(self):
        def MyAddShape(self, shape, x, y, pen, brush, text):
            evthandler = MyEvtHandler()
            return shape
class OGLFrame(wx.Frame):
        def __init__(self, *args, **kwds):
                wx.Frame.__init__(self, *args, **kwds)
                self.SetTitle("Testing right click")
                self.SetBackgroundColour(wx.Colour(8, 197, 248))
                self.canvas = OGLCanvas(self, self)
                self.shape_menu = wx.Menu()
                self.shape_menu.Append(1000, "Add Child")
                self.shape_menu.Append(2000, "Add Text")
                self.Bind(wx.EVT_MENU, self.OnAddChild, id=1000)
                self.Bind(wx.EVT_MENU, self.OnAddText, id=2000)
        def OnAddChild(self, event):
                toShape = self.canvas.MyAddShape(ogl.TextShape(120, 45), 
                    160, 35, wx.GREEN_PEN, wx.LIGHT_GREY_BRUSH, "node 1")
                # this is where I need to use the method
                fromShape = self.canvas.GetSelectedShape()    

Open in new window

Question by:pybee
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
LVL 11

Expert Comment

ID: 24221158
Doesn't the canvas already have a collection that it's keeping the Shapes on the canvas in?

In other words, I think that yes, i think you need to iterate over the shapes and check the flag, but don't create your own array; use the one the canvas already has..

However, all that being said... make sure that overlapping shapes don't BOTH get their selected bit set....



Accepted Solution

pybee earned 0 total points
ID: 24238742
A while back I tried checking the Selected flag for each shape but it never returned the right the shape returned was not the correct one even though there was no overapping going on. I ended up doing something like
frame.currentShape = shape
in my Shape Event Handler so then I can access the current shape from the shape and that is working out fine so far.
LVL 11

Expert Comment

ID: 24245597
"Selected" might mean something different than we think it does... not everything is selectable...

You could try hooking "mousein" / "mouseout"

Author Comment

ID: 24246838
Yes I was thinking the same...that perhaps selected does not mean what I think it means. Thanks for the mouse in/out suggestion as an alternative. At the moment though I'll stick with accessing the current shape from the frame since that seems to do the job and I don't think (or I hope not ) it is bad practice or anything...

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Flask is a microframework for Python based on Werkzeug and Jinja 2. This requires you to have a good understanding of Python 2.7. Lets install Flask! To install Flask you can use a python repository for libraries tool called pip. Download this f…
Sequence is something that used to store data in it in very simple words. Let us just create a list first. To create a list first of all we need to give a name to our list which I have taken as “COURSE” followed by equals sign and finally enclosed …
Learn the basics of lists in Python. Lists, as their name suggests, are a means for ordering and storing values. : Lists are declared using brackets; for example: t = [1, 2, 3]: Lists may contain a mix of data types; for example: t = ['string', 1, T…
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question