where we put the .png files?

hello,
I’m working on a graphic interface with wxpython and I want to make a tool bar with icons. but I don’t know where should I put these icons so that they can be shown. I use eclipse to develop my application. any idea?

Abdessamad EL GON-NOUNI wrote:

It dosn't work, he gives me the msg "Can'l load image from file 'Exit.png':files does not exist"

well, the file needs to be in a place where your app can find it. Check out wxStandardPaths for ways to use standard places to put things.

That's one reason I like the img2py option -- once you've embedded your images in python code, you can find them the same way you import modules, and they'll get packaged up without problem by pyexe, py2app, etc.

I have another problem: when I want to bind an element from the menubar to an event, the program doesn't recognize the method, I have this error msg: 'MainWindow' object has no attribute 'OnExit'

Have you defined a OnExit method in your MainWindow class?

-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

Chris.Barker@noaa.gov

Abdessamad EL GON-NOUNI wrote:

2008/5/1 Mike Driscoll <mdriscoll@co.marshall.ia.us <mailto:mdriscoll@co.marshall.ia.us>>:

    Abdessamad EL GON-NOUNI wrote:

        It dosn't work, he gives me the msg "Can'l load image from
        file 'Exit.png':files does not exist"

    Make sure the path to your png is correct. Also, check out
    wx.ArtProvider for standard icons. I use img2py if I need custom
    icons because it's easier to embed them in my application.

where do I can check this path?

        I have another problem: when I want to bind an element from
        the menubar to an event, the program doesn't recognize the
        method, I have this error msg: 'MainWindow' object has no
        attribute 'OnExit'

    Are you talking about a menu event or a toolbar event?

Both menu and toolbar

    Here's a generic way to create code for a toolbar (I created a ):

    <code>

    def createToolbar(self):
      toolbar = self.CreateToolBar(wx.TB_3DBUTTONS|wx.TB_TEXT)
      self.toolbar.SetToolBitmapSize((16,16))
      print_ico = wx.ArtProvider.GetBitmap(wx.ART_PRINT,
    wx.ART_TOOLBAR, (16,16))
      printTool = self.toolbar.AddSimpleTool(wx.ID_ANY, print_ico,
    'Print', 'Sends Timesheet to Default Printer')
      self.Bind(wx.EVT_MENU, self.OnPrint, sendTool) toolbar.Realize()

    </code>

    And here's how I do menubar code for the same function as above:

    <code>

    menubar = wx.MenuBar()
    fileMenu = wx.Menu()
    printDefault_menu_item = fileMenu.Append(wx.ID_ANY,
    '&Print\tCtrl+P', 'Prints to Default Printer')
    self.Bind(wx.EVT_MENU, self.onPrintDefault, printDefault_menu_item)
    menubar.Append(fileMenu, '&File')
    self.SetMenuBar(menubar)

    </code>

this is my code:
<code>
import wx
ID_OPEN=001
ID_ABOUT=101
ID_EXIT=110

class MainWindow(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, -1, title)
        #self.CreateStatusBar() # A Statusbar in the bottom of the window
        # Setting up the menu.
        menubar = wx.MenuBar(wx.MB_DOCKABLE)
        file = wx.Menu()
        edit = wx.Menu()
        help = wx.Menu()

        file.Append(-1,'&New')
        file.Append(-1, "&Open")
        file.Append(-1, "&Save")
        file.AppendSeparator()
        file.Append(ID_EXIT,"E&xit"," Terminate the program")
               edit.Append(-1, '&Preferences')
        edit.Append(-1, 'Sea&rch')
               menubar.Append(file, '&File')
        menubar.Append(edit, '&Edit')
        menubar.Append(help, '&Help')
        self.SetMenuBar(menubar)
               #Tool Bar
        toolbar = wx.ToolBar(self,-1,style = wx.TB_HORIZONTAL | wx.NO_BORDER)

The wx.Bitmap code below is looking in the directory from which your script is running for the png files. If you're not storing those pngs in that directory, then it fails. Let's pretend that you have them stored at C:\MyPngs. Then to specify this, you would do this instead:

toolbar.AddSimpleTool(wx.ID_OPEN,wx.Bitmap("C:\\MyPngs\\Open.png", wx.BITMAP_TYPE_PNG),shortHelpString = "Ouvrir",longHelpString = "Ouvrir une confiiguration")

        toolbar.AddSimpleTool(wx.ID_OPEN,wx.Bitmap("Open.png", wx.BITMAP_TYPE_PNG),shortHelpString = "Ouvrir",longHelpString = "Ouvrir une confiiguration")
        toolbar.AddSimpleTool (wx.ID_CLOSE,wx.Bitmap("Exit.png", wx.BITMAP_TYPE_PNG),shortHelpString = "Fermer",longHelpString = "Fermer le fichier ouvert")
        toolbar.AddSeparator()
        toolbar.Realize()
        self.SetToolBar(toolbar)
  

<snip>

You can also it using the ArtProvider, like so:

open_ico = wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, (16,16))
toolbar.AddSimpleTool(wx.ID_OPEN,open_ico,shortHelpString = "Ouvrir",longHelpString = "Ouvrir une confiiguration")

Finally, here's how to use img2py:

1) Navigate to your wxPython tools directory. Mine is located at: C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools
2) Copy your png files there (If you're using a command line to do the first 2 steps, then skip to step #5)
3) Open a command window (in Windows, go to Start-Run, and type cmd)
4) Change the directory to the one in step 1
5) Run the following command, changing the icon file name and the output filename as needed:
    python img2py.py -i myIcon.ico icon.py
6) Copy your newly created Python files to the location where your script is and import it in your main script. Then you can use the getIcon() method.

I actually blogged about this here: Reading OpenVPN Status Data with Python (1 of 3) - Mouse Vs Python

See also WorkingWithToolBars - wxPyWiki

Mike