Ayuda con eventos y pasar parametros en Python

John Alexis Guerra Gómez john.guerra en gmail.com
Mar Sep 12 22:50:01 CEST 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Miguel Angel Rueda wrote:
> Defino una clase llamada MyFrame que es un wx.Frame, dentro de la
> funcion __init__
> creo un panel panel = wx.Panel(self) y dentro del panel pongo unos
> botones y
> un cuadro de texto, luego tengo las funciones de los eventos al
> pulsar los
> botones. Lo que pretendo es poder escribir un texto a traves del
> teclado en
> el cuadro de texto y que cada vez que pulse en un boton se añada un
> texto
> especifico al cuadro de texto. El problema viene cuando se produce
> el evento
> de hacer click en el boton y en dicha funcion no puedo hacer
> referencia al
> cuadro de texto para hacer un Append() (de momento lo he solucionado
> creando
> el cuadro de texto como una global de MyFrame, pero supongo que
> habra una
> manera mejor y mas profesional de hacerlo, como vereis en el codigo que
> adjunto).
En realidad yo siempre lo hago así, espero que no sea tan malo =)


> El siguiente problema es que no se como definir que el cuadro de
> texto (wx.TextCtrl) tenga mas de una linea y no me lo meta todo como un
> chorizo.
De la documentación oficial del wx

Window styles

CONVOCATORIA PARA MIPYMES <!-- @page { size: 21cm 29.7cm; margin: 2cm
} P { margin-bottom: 0.21cm } A:link { color: #0000ff }
- -->*wxTE_MULTILINE* The text control allows multiple lines.

es decir que en el constructor debes añadir un parámero
style=wx.TE_MULTILINE así:

       self.panel.cajatexto = wx.TextCtrl(self.panel, -1,
                        "Teclea aqui lo que quieras",
                        size=(300,40),
                        style=wx.TE_MULTILINE)

puedes pasar otros parámetros usando |


> Ademas me imagino que habra alguna forma de poder hacer una unica
> funcion para el evento de pulsar en los botones y dentro de esa
> función,
> saber que boton ha sido el que ha lanzado el evento, en lugar de
> crear una
> función para el evento de cada botón.

Utiliza el método GetEventObject


#! -*- coding: iso8859-1 -*-
#Nuevo Archivo.
#Creado por aguerra.
#Creado: Tue Sep 12 15:34:21 2006

import wx

class MyFrame(wx.Frame):
   def __init__(self, parent, title):
       wx.Frame.__init__(self, parent, -1, title,
                         pos=(150, 150), size=(350, 250))

       menuBar = wx.MenuBar()

       menu = wx.Menu()

       menu.Append(wx.ID_EXIT, u"S&alir\tAlt-X", u"Salir de la
Aplicación")

       self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT)

       menuBar.Append(menu, u"&Aplicación")
       self.SetMenuBar(menuBar)

       self.CreateStatusBar()

       self.panel = wx.Panel(self)

       boton1 = wx.Button(self.panel, -1, "Boton 1")
       boton2 = wx.Button(self.panel, -1, "Boton 2")
       boton3 = wx.Button(self.panel, -1, "Boton 3")
       boton4 = wx.Button(self.panel, -1, "Boton 4")
       boton5 = wx.Button(self.panel, -1, "Boton 5")
       boton6 = wx.Button(self.panel, -1, "Boton 6")
       self.panel.cajatexto = wx.TextCtrl(self.panel, -1, "Teclea aqui
loque quieras",size=(300,40), style=wx.TE_MULTILINE)
       self.panel.cajatexto.SetFocus()

       self.Bind(wx.EVT_BUTTON, self.OnClickBoton, boton1)
       self.Bind(wx.EVT_BUTTON, self.OnClickBoton, boton2)
       self.Bind(wx.EVT_BUTTON, self.OnClickBoton, boton3)

       sizer = wx.BoxSizer(wx.VERTICAL)
       sizerh1 = wx.BoxSizer(wx.HORIZONTAL)
       sizerh1.Add(boton1, 0, wx.ALL, 5)
       sizerh1.Add(boton2, 0, wx.ALL, 5)
       sizerh1.Add(boton3, 0, wx.ALL, 5)
       sizerh1.Add(boton4, 0, wx.ALL, 5)
       sizerh2 = wx.BoxSizer(wx.HORIZONTAL)
       sizerh2.Add(boton5, 0, wx.ALL, 5)
       sizerh2.Add(boton6, 0, wx.ALL, 5)
       sizerh4 = wx.BoxSizer(wx.HORIZONTAL)
       sizerh4.Add(self.panel.cajatexto, 0, wx.ALL, 10)
       sizer.Add(sizerh1, 0, wx.ALL, 0)
       sizer.Add(sizerh2, 0, wx.ALL, 0)
       sizer.Add(sizerh4, 0, wx.ALL, 0)

       self.panel.SetSizer(sizer)
       self.panel.Layout()

   def OnTimeToClose(self, evt,):
       self.Close()

   def OnClickBoton(self, evt,):
       print self.panel.cajatexto.GetValue()
       self.panel.cajatexto.AppendText( evt.GetEventObject().GetLabel())
       print self.panel.cajatexto.GetValue()
       self.panel.cajatexto.SetFocus()

class MyApp(wx.App):
   def OnInit(self):
       frame = MyFrame(None, u"Ejemplo de Aplicación hecha con wxPython")
       self.SetTopWindow(frame)

       print u"Aquí se imprimirá la salida estandar"

       frame.Show(True)
       return True

app = MyApp(redirect=False)
app.MainLoop()


John
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFFBx15c1818t2Wj78RAiGvAJ9xB5Xz42sVFg9O4cOAn6imJSisLQCfQW9u
/vCVqwXpxBgTgm2VKlTzMA0=
=E1sC
-----END PGP SIGNATURE-----




Más información sobre la lista de distribución Python-es