Foros del Web » Programando para Internet » Python »

Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agregar nuevos

Estas en el tema de Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agregar nuevos en el foro de Python en Foros del Web. Buenas amigos. Siento que en esto de Python lo que me está trancando son las herramientas accesorias más que el propio lenguaje. O sea, con ...
  #1 (permalink)  
Antiguo 16/01/2013, 06:39
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agregar nuevos

Buenas amigos.

Siento que en esto de Python lo que me está trancando son las herramientas accesorias más que el propio lenguaje. O sea, con Python en el sentido clásico de lenguaje de programación me revuelvo bien pero me está complicando wxPyton y la parte de base de datos.

En el módulo que vengo armando y en el cual me han dado una mano (razpeitia sobre todo) tengo una base de datos con 5 registros, cada registro tiene número, nombre y una letra S o N para determinar si es el usuario activo o no. (Solo uno es e el activo).

Estoy desarrollando el módulo que lee esos datos, los presenta en pantalla, permite cambiar los nombres de los 5 usuarios y también cambiar cuál es el usuario activo.

Hasta ahí todo bien, lo que no estoy logrando es grabar los cambios una vez que salgo del formulario y confirmo que quiero guardar.

Línea 58.

1) no me doy cuenta como "tomar" los nuevos valores de los 5 wx.TextCtrl que en teoría en la líneas 99 a 103 son asignadas a variables independientes. Si uso usuario1 = text1 me da que la variable no es global. Probé con text1.GetValue() y tampoco

2) en el mismo def def GuardoUsuarios(): no me doy cuenta como grabar las modificaciones sin agregar nuevos registros en la base de datos. Es decir, la base de datos sigue teniendo solo 5 registros pero con datos actualizados.
En otros programas lo podía resolver con un índice o puntero, pero en este caso no me doy cuenta como lograrlo...

Agradezco cualquier idea porque la verdad quedé trancado

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.  
  9. def LeoUsuarios():
  10.     # Necesario para asignar valores
  11.     global usuario1
  12.     global usuario2
  13.     global usuario3
  14.     global usuario4
  15.     global usuario5
  16.     global usuarioactivo, usuarioactivonumero
  17.  
  18.     con = lite.connect('usuariosbd')
  19.     listausuarios = []
  20.    
  21.     with con:
  22.    
  23.         cur = con.cursor()    
  24.         cur.execute("SELECT * FROM Usuarios")
  25.  
  26.  
  27.         while True:
  28.      
  29.             row = cur.fetchone()
  30.            
  31.            
  32.        
  33.             if row == None:
  34.                 break
  35.  
  36.             #Tomo el valor del usuario activo
  37.             if row[2] == "S":
  38.                 print "El usuario activo es :", row[1]
  39.                 usuarioactivo = row[1]
  40.                 usuarioactivonumero = row[0]
  41.  
  42.            
  43.             #agrego a la lista el nombre del usuario
  44.             listausuarios.append(row[1])
  45.  
  46.  
  47.     #asigno cada item de la lista a una variable independiente para conservar los valores una vez que salgo del DEF
  48.     usuario1 = listausuarios[0]
  49.     usuario2 = listausuarios[1]
  50.     usuario3 = listausuarios[2]
  51.     usuario4 = listausuarios[3]
  52.     usuario5 = listausuarios[4]
  53.  
  54.  
  55.     #retorno los datos de usuarios leídos
  56.     return (usuario1, usuario2, usuario3, usuario4, usuario5)
  57.  
  58. def GuardoUsuarios():
  59.     wx.MessageBox('ACEPTAR entonces guardo los cambios', 'Info', wx.OK | wx.ICON_INFORMATION)
  60.     #Asigno los nuevos nombres de Usuarios a guardar
  61.     usuario1 = text1
  62.     print "para verificar si estoy tomando los nuevos nombres de usuarios correctamente"
  63.     print "usuario1 es"
  64.     print wxFrame.text1.GetValue()
  65.  
  66.     #Guardo las actualizaciones de los nombres de Usuarios
  67.    
  68.  
  69.  
  70.  
  71. class RadioButtonFrame(wx.Frame):
  72.     def __init__(self):
  73.  
  74.         print "YA DENTRO DE LA FUNCION TENGO LO SIGUIENTE"
  75.         print usuarioactivo
  76.         print usuarioactivonumero
  77.         wx.Frame.__init__(self, None, -1, 'Radio Example',
  78.                 size=(200, 200))
  79.  
  80.         self.Bind(wx.EVT_CLOSE, self.OnClose)
  81.        
  82.         panel = wx.Panel(self, -1)
  83.         radio1 = wx.RadioButton(panel, -1, "1", pos=(20, 50), style=wx.RB_GROUP)
  84.         radio2 = wx.RadioButton(panel, -1, "2", pos=(20, 80))
  85.         radio3 = wx.RadioButton(panel, -1, "3", pos=(20, 110))
  86.         radio4 = wx.RadioButton(panel, -1, "4", pos=(20, 140))
  87.         radio5 = wx.RadioButton(panel, -1, "5", pos=(20, 170))
  88.  
  89.         #Selecciono el Radio Button activo de acuerdo al Usuario activo leído previamente
  90.         if usuarioactivonumero == 1 : radio1.SetValue(1)
  91.         if usuarioactivonumero == 2 : radio2.SetValue(1)
  92.         if usuarioactivonumero == 3 : radio3.SetValue(1)
  93.         if usuarioactivonumero == 4 : radio4.SetValue(1)
  94.         if usuarioactivonumero == 5 : radio5.SetValue(1)
  95.        
  96.        
  97.         #radio3.SetValue(1)
  98.  
  99.         text1 = wx.TextCtrl(panel, -1, usuario1, pos=(80, 50))
  100.         text2 = wx.TextCtrl(panel, -1, usuario2, pos=(80, 80))
  101.         text3 = wx.TextCtrl(panel, -1, usuario3, pos=(80, 110))
  102.         text4 = wx.TextCtrl(panel, -1, usuario4, pos=(80, 140))
  103.         text5 = wx.TextCtrl(panel, -1, usuario5, pos=(80, 170))
  104.         self.texts = {"1": text1, "2": text2, "3": text3, "4": text4, "5": text5}
  105.         for eachText in [text2, text3, text4, text5]:
  106.             eachText.Enable(False)
  107.         for eachRadio in [radio1, radio2, radio3, radio4, radio5]:
  108.             self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)
  109.         self.selectedText = text1
  110.  
  111.  
  112.     def OnRadio(self, event):
  113.         if self.selectedText:
  114.             self.selectedText.Enable(False)
  115.         radioSelected = event.GetEventObject()
  116.         text = self.texts[radioSelected.GetLabel()]
  117.         text.Enable(True)
  118.         self.selectedText = text
  119.  
  120.     def OnClose(self, event):
  121.         dlg = wx.MessageDialog(self,
  122.             "Guardar los cambios realizados?",
  123.             "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
  124.         result = dlg.ShowModal()
  125.         dlg.Destroy()
  126.         if result == wx.ID_OK:
  127.             GuardoUsuarios()
  128.             self.Destroy()
  129.         else:
  130.             wx.MessageBox('CANCELAR entonces NO guardo los cambios', 'Info', wx.OK | wx.ICON_INFORMATION)
  131.             self.Destroy()
  132.  
  133.  
  134. if __name__ == '__main__':
  135.     app = wx.PySimpleApp()
  136.     LeoUsuarios()
  137.     RadioButtonFrame().Show()
  138.     app.MainLoop()
  #2 (permalink)  
Antiguo 16/01/2013, 13:59
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

No entiendo como accedes al valor de text1, si nunca has declarado un tal objeto wxFrame. Debes crear un objeto el cual va a ser la instancia de la clase RadioButtonFrame:

Código Python:
Ver original
  1. frm = RadioButtonFrame()
  2. frm.Show()

Así podrás acceder a:

Código Python:
Ver original
  1. frm.text1.GetValue()

El comando SQL para actualizar un campo es el siguiente (si esa es tu inquietud):

Código SQL:
Ver original
  1. UPDATE Usuarios SET campo=nuevo_valor WHERE campo=algun_valor

Espero que te sirva!
  #3 (permalink)  
Antiguo 16/01/2013, 15:26
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

1.- No haces el insert o update.
2.- En caso que lo hagas recuerda hacer el commit.
3.- No uses variables globales para algo tan simple.
4.- No enumeres tus variables, variable1, variable2, variable3, etc... es una mala practica.
5.- Cuida los espacios veo espacios (lineas en blanco) en lugares innecesarios.
6.- Trata de usar if ... elif y no varios ifs separados.
7.- No hagas un "select * from table", especifica el nombre de los campos.


Veo que tienes muchas malas practicas, ya no hablo de la separación de conceptos con mvc.

Mira, creo que esto es muy claro, el programar de manera profesional solo lo vas a obtener de una forma, con experiencia. Y la experiencia la obtienes con el tiempo y a base de prueba y error. Entonces no te desesperes, toma tu tiempo y recuerda mejorar tu código de otra forma nunca vas a tener mas experiencia.

PD: También sirve mucho leer código de otros.
  #4 (permalink)  
Antiguo 16/01/2013, 15:50
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

Cita:
Iniciado por carbon Ver Mensaje
No entiendo como accedes al valor de text1, si nunca has declarado un tal objeto wxFrame. Debes crear un objeto el cual va a ser la instancia de la clase RadioButtonFrame:

Código Python:
Ver original
  1. frm = RadioButtonFrame()
  2. frm.Show()

Espero que te sirva!

y no es lo mismo lo que tengo en la línea 99??

text1 = wx.TextCtrl(panel, -1, usuario1, pos=(80, 50))

me sirve y mucho, gracias!
  #5 (permalink)  
Antiguo 16/01/2013, 16:04
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

Cita:
Iniciado por razpeitia Ver Mensaje
1.- No haces el insert o update.
2.- En caso que lo hagas recuerda hacer el commit.
3.- No uses variables globales para algo tan simple.
4.- No enumeres tus variables, variable1, variable2, variable3, etc... es una mala practica.
5.- Cuida los espacios veo espacios (lineas en blanco) en lugares innecesarios.
6.- Trata de usar if ... elif y no varios ifs separados.
7.- No hagas un "select * from table", especifica el nombre de los campos.


Veo que tienes muchas malas practicas, ya no hablo de la separación de conceptos con mvc.

Mira, creo que esto es muy claro, el programar de manera profesional solo lo vas a obtener de una forma, con experiencia. Y la experiencia la obtienes con el tiempo y a base de prueba y error. Entonces no te desesperes, toma tu tiempo y recuerda mejorar tu código de otra forma nunca vas a tener mas experiencia.

PD: También sirve mucho leer código de otros.
1) no, porque justamente no sabía como actualizar los datos sin grabar nuevos registros

2) ok, gracias!

3) idem!

4) es solo para este caso puntual que preciso 5 variables del mismo tipo y las identifico por 1 al 5 porque así es la estructura del programa. El "canal 1" es un usuario de nombre X. El nombre no importa, puede cambiar lo que no cambia es el número 1 en ese caso

5) El código internamente tenía cantidad de PRINT para ir viendo como evolucionaban las variables. Los eliminé antes de pegarlo para que el código quedara más claro pero olvidé borrar las líneas en blanco.

6) Gracias!

7) "No hagas un "select * from table", especifica el nombre de los campos." Ok tomo nota e investigo al respecto.


Sin dudas que tengo malos hábitos porque como mencioné antes no había programado con objetos, si con programas de lenguajes estructurados.

Estoy de acuerdo con tus anotaciones, pero de momento no pretendo programar de forma profesional, preciso que el programa funcione, luego ya lo podré mejorar para hacerlo más sencillo, más "pythoniano", etc.. pero voy aprendiendo sobre la marcha.

"También sirve mucho leer código de otros"

Así vengo aprendiendo, (y leyendo este foro aunque no pueda aportar mucho de momento) pero me mata que la información está muy dispersa.

En los "viejos tiempos" te comprabas un buen manual y ahí tenías todo... a la mano... como hacer un if, un for, como mostrar información en pantalla en forma de texto o gráfica, como leer y escribir en archivos, etc...

Ahora te lees un libro de Python y resulta que cuando terminas no sabes ni siquiera poner una ventana con un texto.. entonces tienes que comenzar a estudiar un tema aparte que son las interfases gráficas... y cuando tienes eso y quieres guardar datos en una base de datos, pues a empezar de nuevo con otra "materia" de estudio... je je je..

De todas formas vengo aprendiendo mucho en poco tiempo, al menos desde mi punto de vista.

Saludos!
  #6 (permalink)  
Antiguo 22/01/2013, 18:22
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

Hola a todos, avancé bastante y pude solucionar el tema de los wxTextCtrl y también simplifiqué el uso de variables de tipo
usuario1, usuario2, usuario3 por una lista

Sin embargo estoy en un error del cual no puedo salir.

1) El programa lee los nombres de usuarios de la base de datos y los despliega asignando cada wxTextCtrl a un RadioButton

2) Permite cambiar los valores de los wxTextCtrl y también el usuario activo

3) Al cerrar el programa si confirmo que quiero guardar los cambios debo lograr llegar a esa parte del programa con los nuevos valores de los usuarios (los tengo guardados en una lista así que funciona) y también con el usuario activo, o sea el último RadioButton seleccionado y acá tengo el problema porque no me reconoce la variable donde almaceno ese valor

Estoy hablando de las línea 126 (donde almaceno el último RadioButton pulsado y efectivamente funciona) y la línea 54 donde imprimo esa misma variable para ver si llegó hasta allí con el valor correcto.

No importa que la defina como global, o que la ponga con un return en la línea 27, igual ESA variable no me reconoce, pero SI me reconoce a los wxTextCtrl... la verdad me tiene desorientado ese problema y llevo dos días sin poder resolverlo.


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. global usuarioactivonumeronuevo
  8.  
  9.  
  10.  
  11. def LeoUsuarios():
  12.     # Necesario para asignar valores
  13.     global listausuarios
  14.     global usuarioactivo, usuarioactivonumero
  15.  
  16.     con = lite.connect('db.usuarios')
  17.     listausuarios = []
  18.    
  19.     with con:
  20.         cur = con.cursor()    
  21.         cur.execute("SELECT * FROM Usuarios")
  22.  
  23.         while True:
  24.             row = cur.fetchone()
  25.            
  26.             if row == None:
  27.                 break
  28.  
  29.             #Tomo el valor del usuario activo
  30.             if row[2] == "S":
  31.                 print "El usuario activo es :", row[1]
  32.                 usuarioactivo = row[1]
  33.                 usuarioactivonumero = row[0]
  34.  
  35.             #print "IMPRIMO LOS TRES CAMPOS PARA VERIFICAR QUE FUERON LEIDOS"
  36.             #print row[0], row[1], row[2]
  37.            
  38.             #agrego a la lista el nombre del usuario
  39.             listausuarios.append(row[1])
  40.  
  41.         print "LISTA DE USUARIOS"
  42.         print listausuarios
  43.  
  44.     #retorno los datos de usuarios leídos
  45.     return (listausuarios)
  46.  
  47. def GuardoUsuarios():
  48.     wx.MessageBox('ACEPTAR entonces guardo los cambios', 'Info', wx.OK | wx.ICON_INFORMATION)
  49.     #Asigno nuevo usuario activo y los nuevos nombres de Usuarios a guardar
  50.     print "==========="
  51.     print "VERIFICANDO"
  52.     print "==========="
  53.     print "U S U A R I O   A C T I V O - "
  54.     print usuarioactivonumeronuevo
  55.     print "EL PRIMER USUARIO ES ", text1.GetValue()
  56.     print "EL SEGUNDO USUARIO ES ", text2.GetValue()
  57.     print "EL TERCER USUARIO ES ", text3.GetValue()
  58.     print "EL CUARTO USUARIO ES ", text4.GetValue()
  59.     print "EL QUINTO USUARIO ES ", text5.GetValue()
  60.  
  61. class RadioButtonFrame(wx.Frame):
  62.     def __init__(self):
  63.         #print "ESTOY DENTRO DE LA SEGUNDA FUNCION Y USUARIO 1 ES"
  64.         #print usuario1
  65.         print "YA DENTRO DE LA FUNCION TENGO LO SIGUIENTE"
  66.         print usuarioactivo
  67.         print usuarioactivonumero
  68.         wx.Frame.__init__(self, None, -1, 'Radio Example',
  69.                 size=(200, 200))
  70.  
  71.         self.Bind(wx.EVT_CLOSE, self.OnClose)
  72.        
  73.         panel = wx.Panel(self, -1)
  74.         radio1 = wx.RadioButton(panel, -1, label="1", pos=(20, 50), style=wx.RB_GROUP)
  75.         radio2 = wx.RadioButton(panel, -1, label="2", pos=(20, 80))
  76.         radio3 = wx.RadioButton(panel, -1, label="3", pos=(20, 110))
  77.         radio4 = wx.RadioButton(panel, -1, label="4", pos=(20, 140))
  78.         radio5 = wx.RadioButton(panel, -1, label="5", pos=(20, 170))
  79.  
  80.         #Selecciono el Radio Button activo de acuerdo al Usuario activo leído previamente
  81.         if usuarioactivonumero == 1 : radio1.SetValue(1)
  82.         if usuarioactivonumero == 2 : radio2.SetValue(1)
  83.         if usuarioactivonumero == 3 : radio3.SetValue(1)
  84.         if usuarioactivonumero == 4 : radio4.SetValue(1)
  85.         if usuarioactivonumero == 5 : radio5.SetValue(1)
  86.        
  87.         #radio3.SetValue(1)
  88.         global text1, text2, text3, text4, text5
  89.  
  90.         text1 = wx.TextCtrl(panel, -1, listausuarios[0], pos=(80, 50))
  91.         text2 = wx.TextCtrl(panel, -1, listausuarios[1], pos=(80, 80))
  92.         text3 = wx.TextCtrl(panel, -1, listausuarios[2], pos=(80, 110))
  93.         text4 = wx.TextCtrl(panel, -1, listausuarios[3], pos=(80, 140))
  94.         text5 = wx.TextCtrl(panel, -1, listausuarios[4], pos=(80, 170))
  95.         self.texts = {"1": text1, "2": text2, "3": text3, "4": text4, "5": text5}
  96.         for eachText in [text1, text2, text3, text4, text5]:
  97.             eachText.Enable(False)
  98.         for eachRadio in [radio1, radio2, radio3, radio4, radio5]:
  99.             self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio, eachRadio)
  100.  
  101.         #Selecciono el Text activo de acuerdo al Usuario activo leído previamente
  102.         self.selectedText = text1
  103.         #print "Estoy verificando y el usuario activo es -->", usuarioactivonumero
  104.        
  105.         if usuarioactivonumero == 1 : text1.Enable(True)
  106.         if usuarioactivonumero == 2 : text2.Enable(True)
  107.         if usuarioactivonumero == 3 : text3.Enable(True)
  108.         if usuarioactivonumero == 4 : text4.Enable(True)
  109.         if usuarioactivonumero == 5 : text5.Enable(True)
  110.  
  111.        
  112.  
  113.     def OnRadio(self, event):
  114.         for eachtext in [text1, text2, text3, text4, text5]:
  115.             eachtext.Enable(False)
  116.         if self.selectedText:
  117.             self.selectedText.Enable(False)
  118.         radioSelected = event.GetEventObject()
  119.        
  120.         text = self.texts[radioSelected.GetLabel()]
  121.         text.Enable(True)
  122.         self.selectedText = text
  123.  
  124.         btn = event.GetEventObject()
  125.         usuarioactivonumeronuevo = btn.GetLabel()
  126.         print "EL BOTON ACTIVO ES", usuarioactivonumeronuevo
  127.         return usuarioactivonumeronuevo
  128.  
  129.  
  130.     def OnClose(self, event):
  131.         dlg = wx.MessageDialog(self,
  132.             "Guardar los cambios realizados?",
  133.             "Confirm Exit", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
  134.         result = dlg.ShowModal()
  135.         dlg.Destroy()
  136.         if result == wx.ID_OK:
  137.             GuardoUsuarios()
  138.             self.Destroy()
  139.         else:
  140.             wx.MessageBox('CANCELAR entonces NO guardo los cambios', 'Info', wx.OK | wx.ICON_INFORMATION)
  141.             self.Destroy()
  142.  
  143. if __name__ == '__main__':
  144.     app = wx.PySimpleApp()
  145.     LeoUsuarios()
  146.     #print "PERO APENAS SALGO EL VALOR DE USUARIO1 ES"
  147.     #print usuario1
  148.     frm = RadioButtonFrame()
  149.     frm.Show()
  150.     #RadioButtonFrame().Show()
  151.     app.MainLoop()
  #7 (permalink)  
Antiguo 22/01/2013, 20:41
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

Código MySQL:
Ver original
  1. create table if not exists Usuarios (
  2.     nombre varchar(150),
  3.     activo varchar(1)
  4. );
  5.  
  6. insert into Usuarios values (1, 'Usuario 1', 'S');
  7. insert into Usuarios values (2, 'Usuario 2', 'N');
  8. insert into Usuarios values (3, 'Usuario 3', 'N');
  9. insert into Usuarios values (4, 'Usuario 4', 'N');
  10. insert into Usuarios values (5, 'Usuario 5', 'N');

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.  
  9. class User(object):
  10.     def __init__(self, _id, name, active):
  11.         self.id = _id
  12.         self.name = name
  13.         self.active = active
  14.  
  15.     def is_active(self):
  16.         return self.active == 'S'
  17.  
  18.     def set_active(self, active):
  19.         if active:
  20.             self.active = 'S'
  21.         else:
  22.             self.active = 'N'
  23.  
  24.     def __str__(self):
  25.         return self.name
  26.  
  27. class Users(object):
  28.     def __init__(self):
  29.         self.user_list = []
  30.  
  31.     def add(self, user):
  32.         self.user_list.append(user)
  33.  
  34.     def __iter__(self):
  35.         return iter(self.user_list)
  36.  
  37. def get_users():
  38.     db_connection = lite.connect('db.usuarios')
  39.     users = Users()
  40.     with db_connection:
  41.         cursor = db_connection.cursor()
  42.         cursor.execute("SELECT id, nombre, activo FROM Usuarios")
  43.  
  44.         for _id, name, active in cursor:
  45.             user = User(_id, name, active)
  46.             users.add(user)
  47.  
  48.     return users
  49.  
  50. def save_users(users):
  51.     db_connection = lite.connect('db.usuarios')
  52.     with db_connection:
  53.         cursor = db_connection.cursor()
  54.         for user in users:
  55.             query = "UPDATE Usuarios SET activo=?, nombre=? WHERE id=?"
  56.             params = (user.active, user.name, user.id)
  57.             cursor.execute(query, params)
  58.         db_connection.commit()
  59.  
  60. class RadioButtonFrame(wx.Frame):
  61.     def __init__(self):
  62.         wx.Frame.__init__(self, None, -1, 'User Admin', size=(200, 200))
  63.  
  64.         self.Bind(wx.EVT_CLOSE, self.OnClose)
  65.        
  66.         panel = wx.Panel(self, -1)
  67.         self.widgets = []
  68.         self.users = get_users()
  69.         for i, user in enumerate(self.users):
  70.             radio = wx.RadioButton(panel, -1, label=str(i+1), pos=(20, 50+(i*30)))
  71.             text = wx.TextCtrl(panel, -1, user.name, pos=(80, 50+(i*30)))
  72.             text.Enable(False)
  73.  
  74.             if user.is_active():
  75.                 radio.SetValue(True)
  76.                 text.Enable(True)
  77.  
  78.             def OnButton(event, radio_index=i):
  79.                 self.OnRadio(event, radio_index)
  80.             radio.Bind(wx.EVT_RADIOBUTTON, OnButton)
  81.  
  82.             widget = {'radio': radio, 'text': text}
  83.             self.widgets.append(widget)
  84.  
  85.     def OnRadio(self, event, index):
  86.         for widget in self.widgets:
  87.             widget['text'].Enable(False)
  88.         widget = self.widgets[index]
  89.         widget['text'].Enable(True)
  90.  
  91.     def OnClose(self, event):
  92.         dlg = wx.MessageDialog(self, "Guardar los cambios realizados?",  "Confirmar Salida", wx.OK|wx.CANCEL|wx.ICON_QUESTION)
  93.         result = dlg.ShowModal()
  94.         dlg.Destroy()
  95.         if result == wx.ID_OK:
  96.             for user, widget in zip(self.users, self.widgets):
  97.                 user.set_active(widget['radio'].GetValue())
  98.                 user.name = widget['text'].GetValue()
  99.             save_users(self.users)
  100.         self.Destroy()
  101.  
  102. if __name__ == '__main__':
  103.     app = wx.PySimpleApp()
  104.     frm = RadioButtonFrame()
  105.     frm.Show()
  106.     app.MainLoop()

Mi intento de hacer esta pequeña app. No esta bien estructurada y hay SQL generado por un humano de por medio, pero hay te dejo la prueba.
  #8 (permalink)  
Antiguo 22/01/2013, 20:45
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 10 meses
Puntos: 35
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

No entendí muy bien, pero si lo que quieres es modificar "usuarioactivonumeronuevo" debes hacer:

Código Python:
Ver original
  1. ...
  2. def OnRadio(self, event):
  3.     global usuarioactivonumeronuevo
  4.     ...

De lo contrario estás creando otra variable que será visible únicamente dentro de esa función, y no para todo el programa.



Edito: No vi tu post razpeitia!
  #9 (permalink)  
Antiguo 22/01/2013, 21:51
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

@carbon no te preocupes, los comentarios u observaciones de la comunidad nunca esta sobra.
  #10 (permalink)  
Antiguo 23/01/2013, 08:28
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

Cita:
Iniciado por razpeitia Ver Mensaje

Mi intento de hacer esta pequeña app. No esta bien estructurada y hay SQL generado por un humano de por medio, pero hay te dejo la prueba.

:o jotes:

Realmente asombroso, el que sabe sabe, y el que no hace programas kilométricos que no funcionan del todo

Te agradezco, funciona perfecto, es lo que precisaba. De todas formas como rehiciste el código para simplificarlo lo voy a estudiar bien para ver las soluciones que implementaste.

Gracias de nuevo.

P.D.: que el código SQL genere los usuarios automáticamente está bien, porque el programa una vez terminado simplemente entrega una base de datos con usuario1, usuario2, usuario3.... etc y la primera vez que se abre el programa te da la posibilidad de cambiar los nombres.
  #11 (permalink)  
Antiguo 23/01/2013, 08:29
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Duda tomar datos de wx.TextCtrl y actualizar registros en la BD sin agrega

Cita:
Iniciado por carbon Ver Mensaje
No entendí muy bien, pero si lo que quieres es modificar "usuarioactivonumeronuevo" debes hacer:

Código Python:
Ver original
  1. ...
  2. def OnRadio(self, event):
  3.     global usuarioactivonumeronuevo
  4.     ...

De lo contrario estás creando otra variable que será visible únicamente dentro de esa función, y no para todo el programa.



Edito: No vi tu post razpeitia!
No puedo creer que lo que estaba haciendo era definir la variable global en el lugar inadecuado!!!

Con ese sencillo cambio mi código funcionó perfecto, muchas gracias, me sirve todo para aprender.!

Etiquetas: sqlite3, 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 11:08.