Foros del Web » Programando para Internet » Python »

wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar los nombres

Estas en el tema de wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar los nombres en el foro de Python en Foros del Web. Una duda, preciso generar algo como: (*) Juan ( ) Pedro ( ) Luis ( ) Mario ( ) Ana O sea que son wxRadioBox ...
  #1 (permalink)  
Antiguo 26/12/2012, 14:18
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar los nombres

Una duda, preciso generar algo como:

(*) Juan
( ) Pedro
( ) Luis
( ) Mario
( ) Ana

O sea que son wxRadioBox de los cuales solo uno puede estar activo.

Eso lo soluciono sin problemas.

El tema es que me gustaría en la misma pantalla poder editar los nombres, independientemente de que sean el nombre activo o no y guardar o cancelar los cambios.

O sea, que se pueda hacer clic en Luis y cambiar el texto Luis por Felipe por ejemplo.

Para cambiar los textos puedo usar wxTextCtrl pero la duda es si puedo combinar los wxRadioBox con wxTextCtrl, de manera que pueda resolver todo en una misma pantalla y sin repetir los textos.

En definitiva que el wxTextCtrl haga de Label del wxRadioBox y al mismo tiempo sea editable.

Creo que no hay ningún Widget que haga eso pero por ahí hay alguna biblioteca ya desarrollada que simplifique este problema.

???


Lo más parecido que encuentro es este ejemplo del libro wxPython in Accion (que me recomendó razpeitia)

Código:
import wx

class RadioButtonFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Radio Example', 
                size=(200, 200))
        panel = wx.Panel(self, -1)
        radio1 = wx.RadioButton(panel, -1, "Elmo", pos=(20, 50), style=wx.RB_GROUP)
        radio2 = wx.RadioButton(panel, -1, "Ernie", pos=(20, 80))
        radio3 = wx.RadioButton(panel, -1, "Bert", pos=(20, 110))
        text1 = wx.TextCtrl(panel, -1, "", pos=(80, 50))
        text2 = wx.TextCtrl(panel, -1, "", pos=(80, 80))
        text3 = wx.TextCtrl(panel, -1, "", pos=(80, 110))
        self.texts = {"Elmo": text1, "Ernie": text2, "Bert": text3}
        for eachText in [text2, text3]:
            eachText.Enable(False)
        for eachRadio in [radio1, radio2, radio3]:
            self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)
        self.selectedText = text1

    def OnRadio(self, event):
        if self.selectedText:
            self.selectedText.Enable(False)
        radioSelected = event.GetEventObject()
        text = self.texts[radioSelected.GetLabel()]
        text.Enable(True)
        self.selectedText = text

if __name__ == '__main__':
    app = wx.PySimpleApp()
    RadioButtonFrame().Show()
    app.MainLoop()
Tal vez lo que busco se podría resolver directamente ocultando las etiquetas de los wx.RadioButton y usando los wx.TextCtrl como si fueran sus etiquetas "editables"....

Última edición por tecafede; 26/12/2012 a las 14:44
  #2 (permalink)  
Antiguo 26/12/2012, 15:15
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: wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar

Puedes hacer lo siguiente, sobre cada RadioButton poner un TextCtrl y ocultarlo.

Después al evento de doble click sobre el RadioButton puedes mostrar el TextCtrl con el label del RadioButton y cuando de enter o pierda el foco el TextCtrl, cambiar el label del RadioButton, ocultar el TextCtrl.
  #3 (permalink)  
Antiguo 27/12/2012, 06:43
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar

Cita:
Iniciado por razpeitia Ver Mensaje
Puedes hacer lo siguiente, sobre cada RadioButton poner un TextCtrl y ocultarlo.

Después al evento de doble click sobre el RadioButton puedes mostrar el TextCtrl con el label del RadioButton y cuando de enter o pierda el foco el TextCtrl, cambiar el label del RadioButton, ocultar el TextCtrl.
La idea no está mal pero el programa lo van a usar personas no muy idóneas así que debo tratar de evitar el clic y doble clic para diferentes comandos.

Voy a ir probando soluciones y las posteo acá mismo por si le sirve más adelante a otras personas.
  #4 (permalink)  
Antiguo 28/12/2012, 07:34
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar

Sigo avanzando pero estoy trancado con el tema de variables globales y como retornar valores de una función.

1) Desde una base de datos leo una tabla y tomo los nombres de los usuarios. Son siempre 5 usuarios así que eso simplifica la tarea

2) deseo tomar esos nombres de usuarios leídos y usarlos como los textos que acompañan a los radioButton

Sin embargo los valores de los usuarios se pierden una vez que salgo del DEF y creo estar haciendo bien la definición de variables globales (inicializando afuera del DEF) y también el retur correspondiente....

Código fuente y Base de datos:
http://www.filedropper.com/variablesglobales

qué está mal?

El código tiene varios print para poder mostrar los valores dentro de cada DEF y fuera.

Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3 as lite
import sys
import wx

def LeoUsuarios():
    con = lite.connect('usuarios.db')
    listausuarios = []
    
    with con:
    
        cur = con.cursor()    
        cur.execute("SELECT * FROM Usuarios")


        while True:
      
            row = cur.fetchone()
            
            
        
            if row == None:
                break

            print "IMPRIMO LOS TRES CAMPOS PARA VERIFICAR QUE FUERON LEIDOS"
            print row[0], row[1], row[2]
            
            #agrego a la lista el nombre del usuario
            listausuarios.append(row[1])
            #print listausuarios


    #asigno cada item de la lista a una variable independiente para conservar los valores una vez que salgo del DEF
    usuario1 = listausuarios[0]
    usuario2 = listausuarios[1]
    usuario3 = listausuarios[2]
    usuario4 = listausuarios[3]
    usuario5 = listausuarios[4]

    #imprimo las variables para ver si va todo bien
    print usuario1
    print usuario2
    print usuario3
    print usuario4
    print usuario5


    print "ANTES DE SALIR EL VALOR DE USUARIO 1 ES ", usuario1
    #retorno los datos de usuarios leídos
    return (usuario1, usuario2, usuario3, usuario4, usuario5)





class RadioButtonFrame(wx.Frame):
    def __init__(self):
        print "ESTOY DENTRO DE LA SEGUNDA FUNCION Y USUARIO 1 ES"
        print usuario1
        wx.Frame.__init__(self, None, -1, 'Radio Example', 
                size=(200, 200))
        panel = wx.Panel(self, -1)
        radio1 = wx.RadioButton(panel, -1, "1", pos=(20, 50), style=wx.RB_GROUP)
        radio2 = wx.RadioButton(panel, -1, "2", pos=(20, 80))
        radio3 = wx.RadioButton(panel, -1, "3", pos=(20, 110))
        radio4 = wx.RadioButton(panel, -1, "4", pos=(20, 140))
        radio5 = wx.RadioButton(panel, -1, "5", pos=(20, 170))
        text1 = wx.TextCtrl(panel, -1, usuario1, pos=(80, 50))
        text2 = wx.TextCtrl(panel, -1, usuario2, pos=(80, 80))
        text3 = wx.TextCtrl(panel, -1, usuario3, pos=(80, 110))
        text4 = wx.TextCtrl(panel, -1, usuario4, pos=(80, 140))
        text5 = wx.TextCtrl(panel, -1, usuario5, pos=(80, 170))
        self.texts = {"1": text1, "2": text2, "3": text3, "4": text4, "5": text5}
        for eachText in [text2, text3, text4, text5]:
            eachText.Enable(False)
        for eachRadio in [radio1, radio2, radio3, radio4, radio5]:
            self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)
        self.selectedText = text1
 

    def OnRadio(self, event):
        if self.selectedText:
            self.selectedText.Enable(False)
        radioSelected = event.GetEventObject()
        text = self.texts[radioSelected.GetLabel()]
        text.Enable(True)
        self.selectedText = text

    def CambiaTexto(self, event):
        EVT_TEXT(id, func)

if __name__ == '__main__':
    #defino variables globales
    usuario1 = ""
    usuario2 = ""
    usuario3 = ""
    usuario4 = ""
    usuario5 = ""
    app = wx.PySimpleApp()
    LeoUsuarios()
    print "PERO APENAS SALGO EL VALOR DE USUARIO1 ES"
    print usuario1
    RadioButtonFrame().Show()
    app.MainLoop()
  #5 (permalink)  
Antiguo 28/12/2012, 10:39
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: wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar

Hay muchas cosas que están mal!

1.- Nunca estas definiendo variables globales! (No voy a discutir sobre lo malo que es usar variables globales)
2.- Incluso si los estas definiendo, nunca vas a poder poner valores de esa forma.
3.- Usar variables como usuario1, usuario2, .... usuarioN es dañino en muchos aspectos.
4.- CambiaTexto nunca es llamada y que bueno por que no tiene sentido.

Código Python:
Ver original
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import sqlite3 as lite
  5. import sys
  6. import wx
  7.  
  8. #defino variables globales
  9. usuario1 = ""
  10. usuario2 = ""
  11. usuario3 = ""
  12. usuario4 = ""
  13. usuario5 = ""
  14.  
  15. def LeoUsuarios():
  16.     # Necesario para asignar valores
  17.     global usuario1
  18.     global usuario2
  19.     global usuario3
  20.     global usuario4
  21.     global usuario5
  22.  
  23.     con = lite.connect('usuarios.db')
  24.     listausuarios = []
  25.    
  26.     with con:
  27.    
  28.         cur = con.cursor()    
  29.         cur.execute("SELECT * FROM Usuarios")
  30.  
  31.  
  32.         while True:
  33.      
  34.             row = cur.fetchone()
  35.            
  36.            
  37.        
  38.             if row == None:
  39.                 break
  40.  
  41.             print "IMPRIMO LOS TRES CAMPOS PARA VERIFICAR QUE FUERON LEIDOS"
  42.             print row[0], row[1], row[2]
  43.            
  44.             #agrego a la lista el nombre del usuario
  45.             listausuarios.append(row[1])
  46.             #print listausuarios
  47.  
  48.  
  49.     #asigno cada item de la lista a una variable independiente para conservar los valores una vez que salgo del DEF
  50.     usuario1 = listausuarios[0]
  51.     usuario2 = listausuarios[1]
  52.     usuario3 = listausuarios[2]
  53.     usuario4 = listausuarios[3]
  54.     usuario5 = listausuarios[4]
  55.  
  56.     #imprimo las variables para ver si va todo bien
  57.     print usuario1
  58.     print usuario2
  59.     print usuario3
  60.     print usuario4
  61.     print usuario5
  62.  
  63.  
  64.     print "ANTES DE SALIR EL VALOR DE USUARIO 1 ES ", usuario1
  65.     #retorno los datos de usuarios leídos
  66.     return (usuario1, usuario2, usuario3, usuario4, usuario5)
  67.  
  68.  
  69.  
  70.  
  71.  
  72. class RadioButtonFrame(wx.Frame):
  73.     def __init__(self):
  74.         print "ESTOY DENTRO DE LA SEGUNDA FUNCION Y USUARIO 1 ES"
  75.         print usuario1
  76.         wx.Frame.__init__(self, None, -1, 'Radio Example',
  77.                 size=(200, 200))
  78.         panel = wx.Panel(self, -1)
  79.         radio1 = wx.RadioButton(panel, -1, "1", pos=(20, 50), style=wx.RB_GROUP)
  80.         radio2 = wx.RadioButton(panel, -1, "2", pos=(20, 80))
  81.         radio3 = wx.RadioButton(panel, -1, "3", pos=(20, 110))
  82.         radio4 = wx.RadioButton(panel, -1, "4", pos=(20, 140))
  83.         radio5 = wx.RadioButton(panel, -1, "5", pos=(20, 170))
  84.         text1 = wx.TextCtrl(panel, -1, usuario1, pos=(80, 50))
  85.         text2 = wx.TextCtrl(panel, -1, usuario2, pos=(80, 80))
  86.         text3 = wx.TextCtrl(panel, -1, usuario3, pos=(80, 110))
  87.         text4 = wx.TextCtrl(panel, -1, usuario4, pos=(80, 140))
  88.         text5 = wx.TextCtrl(panel, -1, usuario5, pos=(80, 170))
  89.         self.texts = {"1": text1, "2": text2, "3": text3, "4": text4, "5": text5}
  90.         for eachText in [text2, text3, text4, text5]:
  91.             eachText.Enable(False)
  92.         for eachRadio in [radio1, radio2, radio3, radio4, radio5]:
  93.             self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)
  94.         self.selectedText = text1
  95.  
  96.  
  97.     def OnRadio(self, event):
  98.         if self.selectedText:
  99.             self.selectedText.Enable(False)
  100.         radioSelected = event.GetEventObject()
  101.         text = self.texts[radioSelected.GetLabel()]
  102.         text.Enable(True)
  103.         self.selectedText = text
  104.  
  105.     def CambiaTexto(self, event):
  106.         EVT_TEXT(id, func)
  107.  
  108. if __name__ == '__main__':
  109.     app = wx.PySimpleApp()
  110.     LeoUsuarios()
  111.     print "PERO APENAS SALGO EL VALOR DE USUARIO1 ES"
  112.     print usuario1
  113.     RadioButtonFrame().Show()
  114.     app.MainLoop()
  #6 (permalink)  
Antiguo 28/12/2012, 11:14
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 11 años, 5 meses
Puntos: 6
Respuesta: wxPython - Seleccionar una opción RadioBox y al mismo tiempo poder editar

Cita:
Iniciado por razpeitia Ver Mensaje
Hay muchas cosas que están mal!

1.- Nunca estas definiendo variables globales! (No voy a discutir sobre lo malo que es usar variables globales)
2.- Incluso si los estas definiendo, nunca vas a poder poner valores de esa forma.
3.- Usar variables como usuario1, usuario2, .... usuarioN es dañino en muchos aspectos.
4.- CambiaTexto nunca es llamada y que bueno por que no tiene sentido.

1 - Había leído que las variables definidas fuera de un DEF eran globales, seguramente me confundí. Tomo nota de tu voto negativo sobre usar variables globales, lo investigaré más adelante)

2 - OK lo investigo

3 - Por? Se me ocurre que una causa es que el programa no es flexible, o sea si quiero 7 usuarios tengo que tocar mucho código no? El tema es que el programa tendrá solo 5 usuarios. Supongo que soluciones más genéricas habrían sido con listas tal como las cargué desde la base de datos.

Justamente como no me permitía usar la lista inicial ( listausuarios ) tuve que armar todas esas artimañas.

Seguramente no es nada prolijo y mucho menos pythoniano je je je... y iré tomándole la mano a formas más pythonianas de programar.

4 - Correcto, era un intento anterior que me olvidé de borrar

Sigo aprendiendo!

Feliz 2013 y gracias por todo!

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 22:00.