Foros del Web » Programando para Internet » Python »

Duda como referenciar a un botón de la ToolBar

Estas en el tema de Duda como referenciar a un botón de la ToolBar en el foro de Python en Foros del Web. En este ejercicio que estoy haciendo: http://www.filedropper.com/cambiarpanelesdesdetoolbar (Archivo Python + 2 iconos) Deseo simplemente que al hacer clic en una de las herramientas se muestre ...
  #1 (permalink)  
Antiguo 23/12/2012, 07:57
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 6 meses
Puntos: 6
Duda como referenciar a un botón de la ToolBar

En este ejercicio que estoy haciendo:

http://www.filedropper.com/cambiarpanelesdesdetoolbar

(Archivo Python + 2 iconos)

Deseo simplemente que al hacer clic en una de las herramientas se muestre el panel correspondiente y se oculte el otro. Los paneles están vacíos, es solo para probar si los botones funcionan.

Curiosamente puedo lograr ese resultado si uso botones estándard DENTRO de los paneles, pero no logro hacerlo con los propios botones de la toolbar.

O sea con botones comunes lo resolvería con algo como

Código:
self.Bind(wx.EVT_BUTTON, self.OnClickHerramienta1, self.button_Herramienta1)
Deber ser algo de sintaxis con la forma de referenciar a los botones de la toolbar pero no encuentro solución y ya busqué en la web también y no encuentro ejemplos funcionando.

Es decir, si defino el botón de la Toolbar con:
Código:
self.frame_1_toolbar.AddLabelTool(1, "HERRAMIENTA1", wx.Bitmap("1.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta1", "Herramienta1")

No debería poder referenciarlo con??

Código:
self.Bind(wx.EVT_BUTTON, self.OnClickHerramienta1, self.button_Herramienta1)
La verdad que intento avanzar en Python pero la poca documentación de ejemplos sencillos funcionando hace bastante pesado el camino.

No encontré en la web un solo ejemplo de este tipo para poder basarme.


Código:
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# generated by wxGlade 0.6.5 (standalone edition) on Wed Dec 19 10:19:46 2012

import wx

# begin wxGlade: extracode
# end wxGlade


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        
        # Tool Bar
        self.frame_1_toolbar = wx.ToolBar(self, -1)
        self.SetToolBar(self.frame_1_toolbar)
        self.frame_1_toolbar.AddLabelTool(1, "HERRAMIENTA1", wx.Bitmap("1.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta1", "Herramienta1")
        self.frame_1_toolbar.AddLabelTool(2, "HERRAMIENTA2", wx.Bitmap("2.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta2", "Herramienta2")
        # Tool Bar end

        #Defino los dos paneles
        self.panel_1 = wx.Panel(self, -1)
        self.sizer_3_staticbox = wx.StaticBox(self.panel_1, -1, "PANEL DE LA HERRAMIENTA 1 - UNO")

        self.panel_2 = wx.Panel(self, -1)
        self.sizer_3_staticbox = wx.StaticBox(self.panel_1, -1, "PANEL DE LA HERRAMIENTA 2 - DOS")

        self.__set_properties()
        self.__do_layout()


        self.Bind(wx.EVT_BUTTON, self.OnClickHerramienta1, self.button_Herramienta1)
        self.Bind(wx.EVT_BUTTON, self.OnClickHerramienta2, self.button_Herramienta2)
        # end wxGlade

    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("frame_1")
        self.frame_1_toolbar.SetToolBitmapSize((32, 32))
        self.frame_1_toolbar.Realize()
        self.panel_1.SetBackgroundColour(wx.Colour(216, 191, 216))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        self.sizer_3_staticbox.Lower()
        sizer_3 = wx.StaticBoxSizer(self.sizer_3_staticbox, wx.HORIZONTAL)
        self.panel_1.SetSizer(sizer_3)
        sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        self.Layout()
        # end wxGlade


    def OnClickHerramienta1(self, event): 
        self.panel_1.Show()
        self.panel_2.Hide()
         
        self.Layout()
        event.Skip()


    def OnClickHerramienta2(self, event): 
        self.panel_1.Hide()
        self.panel_2.Show()
         
        self.Layout()
        event.Skip()



# end of class MyFrame
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()
  #2 (permalink)  
Antiguo 23/12/2012, 12:34
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda como referenciar a un botón de la ToolBar

En el Glade puedes añadirle el nombre de tu EventHandler.

O si lo prefieres hacer manual:
Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: iso-8859-15 -*-
  3. # generated by wxGlade 0.6.5 (standalone edition) on Wed Dec 19 10:19:46 2012
  4.  
  5. import wx
  6.  
  7. # begin wxGlade: extracode
  8. # end wxGlade
  9.  
  10.  
  11. class MyFrame(wx.Frame):
  12.     def __init__(self, *args, **kwds):
  13.         # begin wxGlade: MyFrame.__init__
  14.         kwds["style"] = wx.DEFAULT_FRAME_STYLE
  15.         wx.Frame.__init__(self, *args, **kwds)
  16.        
  17.         # Tool Bar
  18.         self.frame_1_toolbar = wx.ToolBar(self, -1)
  19.         self.SetToolBar(self.frame_1_toolbar)
  20.         self.button_Herramienta1 = self.frame_1_toolbar.AddLabelTool(1, "HERRAMIENTA1", wx.Bitmap("1.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta1", "Herramienta1")
  21.         self.button_Herramienta2 = self.frame_1_toolbar.AddLabelTool(2, "HERRAMIENTA2", wx.Bitmap("2.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta2", "Herramienta2")
  22.         # Tool Bar end
  23.  
  24.         #Defino los dos paneles
  25.         self.panel_1 = wx.Panel(self, -1)
  26.         self.sizer_3_staticbox = wx.StaticBox(self.panel_1, -1, "PANEL DE LA HERRAMIENTA 1 - UNO")
  27.  
  28.         self.panel_2 = wx.Panel(self, -1)
  29.         self.sizer_3_staticbox = wx.StaticBox(self.panel_1, -1, "PANEL DE LA HERRAMIENTA 2 - DOS")
  30.  
  31.         self.__set_properties()
  32.         self.__do_layout()
  33.  
  34.  
  35.         self.Bind(wx.EVT_BUTTON, self.OnClickHerramienta1, self.button_Herramienta1)
  36.         self.Bind(wx.EVT_BUTTON, self.OnClickHerramienta2, self.button_Herramienta2)
  37.         # end wxGlade
  38.  
  39.     def __set_properties(self):
  40.         # begin wxGlade: MyFrame.__set_properties
  41.         self.SetTitle("frame_1")
  42.         self.frame_1_toolbar.SetToolBitmapSize((32, 32))
  43.         self.frame_1_toolbar.Realize()
  44.         self.panel_1.SetBackgroundColour(wx.Colour(216, 191, 216))
  45.         # end wxGlade
  46.  
  47.     def __do_layout(self):
  48.         # begin wxGlade: MyFrame.__do_layout
  49.         sizer_1 = wx.BoxSizer(wx.VERTICAL)
  50.         self.sizer_3_staticbox.Lower()
  51.         sizer_3 = wx.StaticBoxSizer(self.sizer_3_staticbox, wx.HORIZONTAL)
  52.         self.panel_1.SetSizer(sizer_3)
  53.         sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
  54.         self.SetSizer(sizer_1)
  55.         sizer_1.Fit(self)
  56.         self.Layout()
  57.         # end wxGlade
  58.  
  59.  
  60.     def OnClickHerramienta1(self, event):
  61.         self.panel_1.Show()
  62.         self.panel_2.Hide()
  63.          
  64.         self.Layout()
  65.         event.Skip()
  66.  
  67.  
  68.     def OnClickHerramienta2(self, event):
  69.         self.panel_1.Hide()
  70.         self.panel_2.Show()
  71.          
  72.         self.Layout()
  73.         event.Skip()
  74.  
  75.  
  76.  
  77. # end of class MyFrame
  78. if __name__ == "__main__":
  79.     app = wx.PySimpleApp(0)
  80.     wx.InitAllImageHandlers()
  81.     frame_1 = MyFrame(None, -1, "")
  82.     app.SetTopWindow(frame_1)
  83.     frame_1.Show()
  84.     app.MainLoop()
  #3 (permalink)  
Antiguo 23/12/2012, 14:38
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Duda como referenciar a un botón de la ToolBar

En principio entiendo la idea, es como asignar a una variable la creación del botón.

Sin embargo en el código de ejemplo citado por tí sigue sin funcionar que al hacer clic cambien los paneles que se muestran.

Además siempre se muestra el panel2 como activo cuando inicialmente debería verse solo el panel1.

probé colocar un

self.panel_2.Hide()

en varios lugares sin éxito

  #4 (permalink)  
Antiguo 23/12/2012, 15:13
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda como referenciar a un botón de la ToolBar

Te recomiendo leer wxpython in action, te ayudara a ententer todo lo que necesitas sobre wx.

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # generated by wxGlade 0.6.4 on Wed Dec 19 11:21:44 2012
  4.  
  5. import wx
  6.  
  7. # begin wxGlade: extracode
  8. # end wxGlade
  9.  
  10.  
  11. class MyFrame(wx.Frame):
  12.     def __init__(self, *args, **kwds):
  13.         # begin wxGlade: MyFrame.__init__
  14.         kwds["style"] = wx.DEFAULT_FRAME_STYLE
  15.         wx.Frame.__init__(self, *args, **kwds)
  16.         self.panel_1 = wx.Panel(self, -1)
  17.         self.static_box_1 = wx.StaticBox(self.panel_1, -1, "PANEL DE LA HERRAMIENTA 1 - UNO")
  18.         self.panel_2 = wx.Panel(self, -1)
  19.         self.static_box_2 = wx.StaticBox(self.panel_2, -1, "PANEL DE LA HERRAMIENTA 2 - DOS")
  20.  
  21.  
  22.         self.__set_properties()
  23.         self.__do_layout()
  24.  
  25.         self.Bind(wx.EVT_TOOL, self.OnClickHerramienta1, self.button_Herramienta1)
  26.         self.Bind(wx.EVT_TOOL, self.OnClickHerramienta2, self.button_Herramienta2)
  27.         # end wxGlade
  28.  
  29.     def __set_properties(self):
  30.         # begin wxGlade: MyFrame.__set_properties
  31.         self.SetTitle("frame_1")
  32.         self.SetSize((300, 300))
  33.         self.panel_2.Hide()
  34.         # end wxGlade
  35.  
  36.     def __do_layout(self):
  37.         # begin wxGlade: MyFrame.__do_layout
  38.         # Tool Bar
  39.         self.frame_1_toolbar = wx.ToolBar(self, -1)
  40.         self.SetToolBar(self.frame_1_toolbar)
  41.         self.button_Herramienta1 = self.frame_1_toolbar.AddLabelTool(1, "HERRAMIENTA1", wx.Bitmap("1.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta1", "Herramienta1")
  42.         self.button_Herramienta2 = self.frame_1_toolbar.AddLabelTool(2, "HERRAMIENTA2", wx.Bitmap("2.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta2", "Herramienta2")
  43.         # Tool Bar end
  44.  
  45.         sizer_1 = wx.BoxSizer(wx.VERTICAL)
  46.         sizer_3 = wx.BoxSizer(wx.VERTICAL)
  47.         sizer_2 = wx.BoxSizer(wx.VERTICAL)
  48.         sizer_2.Add(self.static_box_1, 0, 0, 0)
  49.         self.panel_1.SetSizer(sizer_2)
  50.         sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
  51.         sizer_3.Add(self.static_box_2, 0, 0, 0)
  52.         self.panel_2.SetSizer(sizer_3)
  53.         sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
  54.         self.SetSizer(sizer_1)
  55.         self.Layout()
  56.         # end wxGlade
  57.  
  58.     def OnClickHerramienta1(self, event):
  59.         self.panel_1.Hide()
  60.         self.panel_2.Show()
  61.     self.Layout()
  62.         event.Skip()
  63.  
  64.     def OnClickHerramienta2(self, event):
  65.         self.panel_2.Hide()
  66.         self.panel_1.Show()
  67.     self.Layout()
  68.         event.Skip()
  69.  
  70. # end of class MyFrame
  71. if __name__ == "__main__":
  72.     app = wx.PySimpleApp(0)
  73.     wx.InitAllImageHandlers()
  74.     frame_1 = MyFrame(None, -1, "")
  75.     app.SetTopWindow(frame_1)
  76.     frame_1.Show()
  77.     app.MainLoop()
  #5 (permalink)  
Antiguo 23/12/2012, 15:48
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Duda como referenciar a un botón de la ToolBar

Cita:
Iniciado por razpeitia Ver Mensaje
Te recomiendo leer wxpython in action, te ayudara a ententer todo lo que necesitas sobre wx.
Muy agradecido!

Hasta ahora vengo leyendo libros como Dive into Python, Python para todos, Aprende a pensar como un programador, etc..y si bien los conceptos los comprendo justamente lo que me está deteniendo es la implementación de las interfases.

Voy a leer ese libro comenzando mañana mismo.
  #6 (permalink)  
Antiguo 23/12/2012, 16:34
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 6 meses
Puntos: 6
Respuesta: Duda como referenciar a un botón de la ToolBar

En el último código que pegaste te olvidaste de la orden

self.frame_1_toolbar.Realize()

por eso no aparece la barra de iconos

dejo el código completo y funcionando por si le sirve a alguien más!

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# generated by wxGlade 0.6.4 on Wed Dec 19 11:21:44 2012
 
import wx
 
# begin wxGlade: extracode
# end wxGlade
 
 
class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.panel_1 = wx.Panel(self, -1)
        self.static_box_1 = wx.StaticBox(self.panel_1, -1, "PANEL DE LA HERRAMIENTA 1 - UNO")
        self.panel_2 = wx.Panel(self, -1)
        self.static_box_2 = wx.StaticBox(self.panel_2, -1, "PANEL DE LA HERRAMIENTA 2 - DOS")
 
 
        self.__set_properties()
        self.__do_layout()
 
        self.Bind(wx.EVT_TOOL, self.OnClickHerramienta1, self.button_Herramienta1)
        self.Bind(wx.EVT_TOOL, self.OnClickHerramienta2, self.button_Herramienta2)
        # end wxGlade
 
    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("frame_1")
        self.SetSize((300, 300))
        self.panel_2.Hide()
        
        # end wxGlade
 
    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        # Tool Bar
        self.frame_1_toolbar = wx.ToolBar(self, -1)
        self.SetToolBar(self.frame_1_toolbar)
        self.button_Herramienta1 = self.frame_1_toolbar.AddLabelTool(1, "HERRAMIENTA1", wx.Bitmap("1.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta1", "Herramienta1")
        self.button_Herramienta2 = self.frame_1_toolbar.AddLabelTool(2, "HERRAMIENTA2", wx.Bitmap("2.png", wx.BITMAP_TYPE_ANY), wx.NullBitmap, wx.ITEM_NORMAL, "Herramienta2", "Herramienta2")
        # Tool Bar end
 
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_2.Add(self.static_box_1, 0, 0, 0)
        self.panel_1.SetSizer(sizer_2)
        sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
        sizer_3.Add(self.static_box_2, 0, 0, 0)
        self.panel_2.SetSizer(sizer_3)
        sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_1)
        self.frame_1_toolbar.Realize()
        self.Layout()
        # end wxGlade
 
    def OnClickHerramienta1(self, event):
        self.panel_1.Show()
        self.panel_2.Hide()
        self.Layout()
        event.Skip()
 
    def OnClickHerramienta2(self, event):
        self.panel_1.Hide()
        self.panel_2.Show()
        self.Layout()
        event.Skip()
 
# end of class MyFrame
if __name__ == "__main__":
    app = wx.PySimpleApp(0)
    wx.InitAllImageHandlers()
    frame_1 = MyFrame(None, -1, "")
    app.SetTopWindow(frame_1)
    frame_1.Show()
    app.MainLoop()

Etiquetas: wxpython
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:02.