[wxPython] Toolbar different images from bmp

Post here if you need help with creating a Graphical User Interface in Python.

[wxPython] Toolbar different images from bmp

Postby Mograine » Tue Dec 10, 2013 2:58 pm

I'm in the first exercises with wxPython. By practicing with menus and toolbars, I created this program:
Code: Select all
from wxPython.wx import *

class MioFrame(wxFrame):
    def __init__(self):
        wxFrame.__init__(self, None, -1, "Toolbar")
        self.CreateStatusBar()

        # Id utilizzati dal pulsante e dal combo
        # inseriti nella toolbar.
        ID_INFO = wxNewId()
        ID_COMBO = wxNewId()
        tb = self.CreateToolBar(wxTB_HORIZONTAL|
                                wxNO_BORDER|wxTB_FLAT)

        # bmp contiene un'immagine caricata dal
        # file "nuovo.bmp".
        bmp = wxBitmap("nuovo.bmp", wxBITMAP_TYPE_BMP)
        tb.AddSimpleTool(ID_INFO, bmp, "Nuovo",
                         "Crea un nuovo documento")
        # Alla pressione del pulsante viene chiamata self.OnNuovo.
        EVT_TOOL(self, ID_INFO, self.OnNuovo)

        # Aggiunge un separatore fra i due controlli.
        tb.AddSeparator()

        # Viene creato un combo box, maggiori informazioni
        # saranno date nei capitoli successivi.
        combo = wxComboBox(tb, ID_COMBO, choices =
                           ["Ciao", "sono", "un", "combobox"])
        # Il combo box appena creato viene inserito
        # nella tool bar.
        tb.AddControl(combo)
        # Quando viene cambiata la selezione nel combobox
        # viene chiamata self.on_combo.
        EVT_COMBOBOX(self, ID_COMBO, self.OnCombo)

        # Realize deve essere chiamata affinché i cambiamenti
        # fatti alla toolbar siano visibili.
        tb.Realize()


    def OnNuovo(self, event):
        wxMessageBox("Questo funzione dovrebbe creare "
                     "un nuovo documento ma non è "
                     "stata implementata.")

    def OnCombo(self, event):
        # Nella versione di wxPython utilizzata per la
        # scrittura del tutorial questa funzione
        # viene richiamata 3 volte a causa di un bug.
        wxMessageBox("La selezione del combobox è "
                     "stata cambiata.")


class MiaApp(wxApp):
    def OnInit(self):
        frame = MioFrame()
        frame.Show(1)
        self.SetTopWindow(frame)
        return 1

app = MiaApp()
app.MainLoop()


In line 17 and 18 this code uses a bmp file to create a button. Now, I would have to ask you a question: you can use .ico (or libraries of .icon files) or .png file to create toolbar buttons? If yes, could you tell me how? I've been looking for hours in the documentation but have not found anything about it
Last edited by stranac on Tue Dec 10, 2013 3:05 pm, edited 1 time in total.
Reason: First post lock. Included code in code tags instead of paste link.
User avatar
Mograine
 
Posts: 5
Joined: Tue Dec 10, 2013 2:47 pm

Re: [wxPython] Toolbar different images from bmp

Postby Yoriz » Tue Dec 10, 2013 6:15 pm

What version of wxpython are you using, the code looks a little strange to me.

your import
Code: Select all
from wxPython.wx import *

should just be
Code: Select all
import wx

Then when using something from wx for instance instead of
Code: Select all
class MioFrame(wxFrame):

would be
Code: Select all
class MioFrame(wx.Frame):

Try
Code: Select all
 bmp_from_ico = wx.Bitmap("nuovo.ico", wx.BITMAP_TYPE_ANY)
 bmp_from_png = wx.Bitmap("nuovo.png", wx.BITMAP_TYPE_ANY)
New Users, Read This
Join the #python-forum IRC channel on irc.freenode.net!
Spam topic disapproval technician
Windows7, Python 2.7.4., WxPython 2.9.5.0., some Python 3.3
User avatar
Yoriz
 
Posts: 721
Joined: Fri Feb 08, 2013 1:35 am
Location: UK

Re: [wxPython] Toolbar different images from bmp

Postby Mograine » Tue Dec 10, 2013 8:24 pm

Yoriz wrote:What version of wxpython are you using, the code looks a little strange to me.


2.7, the one compatible with the most updated version of Python, since there isn't a version for Python 3.3
User avatar
Mograine
 
Posts: 5
Joined: Tue Dec 10, 2013 2:47 pm

Re: [wxPython] Toolbar different images from bmp

Postby Yoriz » Tue Dec 10, 2013 8:27 pm

2.8 is the latest stable version, i use the development version 2.9 and have no problems with it, also maybe you are using an out of date tutorial.
New Users, Read This
Join the #python-forum IRC channel on irc.freenode.net!
Spam topic disapproval technician
Windows7, Python 2.7.4., WxPython 2.9.5.0., some Python 3.3
User avatar
Yoriz
 
Posts: 721
Joined: Fri Feb 08, 2013 1:35 am
Location: UK

Re: [wxPython] Toolbar different images from bmp

Postby Mograine » Tue Dec 10, 2013 9:46 pm

The 2.9 version is compatible with Python 3.3?
User avatar
Mograine
 
Posts: 5
Joined: Tue Dec 10, 2013 2:47 pm

Re: [wxPython] Toolbar different images from bmp

Postby Yoriz » Tue Dec 10, 2013 10:09 pm

No WxPython 2.9.5 is for python 2.7
For python 3 ProjectPhoenix is in development.
New Users, Read This
Join the #python-forum IRC channel on irc.freenode.net!
Spam topic disapproval technician
Windows7, Python 2.7.4., WxPython 2.9.5.0., some Python 3.3
User avatar
Yoriz
 
Posts: 721
Joined: Fri Feb 08, 2013 1:35 am
Location: UK

Re: [wxPython] Toolbar different images from bmp

Postby Mograine » Tue Dec 10, 2013 11:51 pm

This is the new code:

Code: Select all
import wx

class MioFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Toolbar")
        self.CreateStatusBar()

        # Id utilizzati dal pulsante e dal combo
        # inseriti nella toolbar.
        ID_INFO = wx.NewId()
        ID_COMBO = wx.NewId()
        tb = self.CreateToolBar(wx.TB_HORIZONTAL|
                                wx.NO_BORDER|wx.TB_FLAT)

        # bmp contiene un'immagine caricata dal
        # file "nuovo.bmp".
        bmp_from_ico = wx.Bitmap("star_blue.ico", wx.BITMAP_TYPE_ANY)
        tb.AddTool(ID_INFO, bmp_from_ico, "Nuovo",
                         "Crea un nuovo documento")
        # Alla pressione del pulsante viene chiamata self.OnNuovo.
        EVT_TOOL(self, ID_INFO, self.OnNuovo)

        # Aggiunge un separatore fra i due controlli.
        tb.AddSeparator()

        # Viene creato un combo box, maggiori informazioni
        # saranno date nei capitoli successivi.
        combo = wx.ComboBox(tb, ID_COMBO, choices =
                           ["Ciao", "sono", "un", "combobox"])
        # Il combo box appena creato viene inserito
        # nella tool bar.
        tb.AddControl(combo)
        # Quando viene cambiata la selezione nel combobox
        # viene chiamata self.on_combo.
        EVT_COMBOBOX(self, ID_COMBO, self.OnCombo)

        # Realize deve essere chiamata affinché i cambiamenti
        # fatti alla toolbar siano visibili.
        tb.Realize()


    def OnNuovo(self, event):
        wx.MessageBox("Questo funzione dovrebbe creare "
                     "un nuovo documento ma non è "
                     "stata implementata.")

    def OnCombo(self, event):
        # Nella versione di wx.Python utilizzata per la
        # scrittura del tutorial questa funzione
        # viene richiamata 3 volte a causa di un bug.
        wx.MessageBox("La selezione del combobox è "
                     "stata cambiata.")


class MiaApp(wx.App):
    def OnInit(self):
        frame = MioFrame()
        frame.Show(1)
        self.SetTopWindow(frame)
        return 1

app = MiaApp()
app.MainLoop()


PyScripters returns me this error:
Message File Name Line Position
Traceback
<module> <modulo1> 62
__init__ C:\Python27\lib\site-packages\wx-2.9.5-msw\wx\_core.py 8631
_BootstrapApp C:\Python27\lib\site-packages\wx-2.9.5-msw\wx\_core.py 8196
OnInit <modulo1> 57
__init__ <modulo1> 19
AddTool C:\Python27\lib\site-packages\wx-2.9.5-msw\wx\_controls.py 3633
DoAddTool C:\Python27\lib\site-packages\wx-2.9.5-msw\wx\_controls.py 3608
TypeError: in method 'ToolBarBase_DoAddTool', expected argument 5 of type 'wxBitmap const &'


Moreover, it is highlighted the line 608 of the file _controls.py:
return _controls_.ToolBarBase_DoAddTool(*args, **kwargs)
User avatar
Mograine
 
Posts: 5
Joined: Tue Dec 10, 2013 2:47 pm

Re: [wxPython] Toolbar different images from bmp

Postby octopez » Wed Dec 11, 2013 8:01 am

This was not the whole traceback I guess.
I've copied the source and had to fix several mistakes to get it to work.

What did I do?
a) added she-bangs for encoding (utf-8)
b) removed several non utf-8 characters in comments just to be sure
c) fixed Toolbar.AddTool(). AddTool() needs: ID, bmp1, bmp2, string, string) as arguments
d) commented several EVT_....

I was unable to figure out some functions, as the comments were not english and unfortunately I don't speak italian all that well. ;)

Code: Select all
#! /usr/bin/env python
#! coding: utf-8

import wx

class MioFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Toolbar")
        self.CreateStatusBar()

        # Id utilizzati dal pulsante e dal combo
        # inseriti nella toolbar.
        ID_INFO = wx.NewId()
        ID_COMBO = wx.NewId()
        tb = self.CreateToolBar(wx.TB_HORIZONTAL|
                                wx.NO_BORDER|wx.TB_FLAT)

        # bmp contiene un'immagine caricata dal
        # file "nuovo.bmp".
        bmp_from_ico = wx.Bitmap("PDF.ico", wx.BITMAP_TYPE_ANY)
        tb.AddTool(ID_INFO, bmp_from_ico, bmp_from_ico, "Nuovo", "Crea un nuovo documento")
        # Alla pressione del pulsante viene chiamata self.OnNuovo.
        #EVT_TOOL(self, ID_INFO, self.OnNuovo)

        # Aggiunge un separatore fra i due controlli.
        tb.AddSeparator()

        # Viene creato un combo box, maggiori informazioni
        # saranno date nei capitoli successivi.
        combo = wx.ComboBox(tb, ID_COMBO, choices =
                           ["Ciao", "sono", "un", "combobox"])
        # Il combo box appena creato viene inserito
        # nella tool bar.
        tb.AddControl(combo)
        # Quando viene cambiata la selezione nel combobox
        # viene chiamata self.on_combo.
        #EVT_COMBOBOX(self, ID_COMBO, self.OnCombo)

        # Realize deve essere chiamata affinche i cambiamenti
        # fatti alla toolbar siano visibili.
        tb.Realize()


    def OnNuovo(self, event):
        wx.MessageBox("Questo funzione dovrebbe creare "
                     "un nuovo documento ma non e "
                     "stata implementata.")

    def OnCombo(self, event):
        # Nella versione di wx.Python utilizzata per la
        # scrittura del tutorial questa funzione
        # viene richiamata 3 volte a causa di un bug.
        wx.MessageBox("La selezione del combobox è "
                     "stata cambiata.")


class MiaApp(wx.App):
    def OnInit(self):
        frame = MioFrame()
        frame.Show(1)
        self.SetTopWindow(frame)
        return 1

app = MiaApp()
app.MainLoop()


edit: it is always a good idea to take a look at the "wxPython Docs and Demos", as all the GUI elements are documented there very good!
Greetings and all the best,
Octopez

Strange women lying in ponds distributing swords is no basis for a system of government.
User avatar
octopez
 
Posts: 25
Joined: Fri Feb 08, 2013 11:26 pm


Return to GUI

Who is online

Users browsing this forum: No registered users and 0 guests