Ayuda con eventos y pasar parametros en Python

Miguel Angel Rueda miguelangel.rueda en gmail.com
Jue Sep 7 17:36:14 CEST 2006


Hola de nuevo.

Estoy empezando con la programacion orientada a objetos y con Python. He
empezado por un pequeño programita con el modulo wxPython en el cual tengo
unos botones y una caja de texto (wx.TextCtrl) y tengo varias dudas que
espero me podais resolver. Una de ellas es si hay algun objeto, funcion o lo
que sea que en una función dentro de una clase pueda hacer referencia a
otros objetos definidos en otras funciones de esa misma clase. Me explico,
porque no se si lo he expresado bien.

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). 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. 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.

Muchas gracias por adelantado.

¡ Ah, se me olvidaba! ¿sabeis que modulo puedo utilizar para trabajar en el
puerto de comunicaciones o el puerto serie del PC?.


Este es el codigo:

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, "S&alir\tAlt-X", "Salir de la Aplicación")

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

        menuBar.Append(menu, "&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 lo
que quieras",size=(300,40))
        self.panel.cajatexto.SetFocus()

        self.Bind(wx.EVT_BUTTON, self.OnClickBoton1, boton1)
        self.Bind(wx.EVT_BUTTON, self.OnClickBoton2, boton2)
        self.Bind(wx.EVT_BUTTON, self.OnClickBoton3, 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 OnClickBoton1(self, evt,):
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.AppendText(" Boton 1 ")
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.SetFocus()

    def OnClickBoton2(self, evt,):
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.AppendText(" Boton 2 ")
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.SetFocus()

    def OnClickBoton3(self, evt,):
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.AppendText(" Boton 3 ")
        print self.panel.cajatexto.GetValue()
        self.panel.cajatexto.SetFocus()


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

        print "Aquí se imprimirá la salida estandar"

        frame.Show(True)
        return True

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




Salu2.




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