Foros Python

Versión completa: Pasar datos de Combobox a sqlite3
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Tengo una tabla en sqlite3 y  deseo que en un campo / columna en vez de teclearlo seleccione una de las tres opciones que presenta el Combobox que he creado. Pero no consigo que esta selección pase al registro ni en "Añadir/crear" ni en "Editar". Aquí prsento las dos formas en que he intentado pasarlas a Edit sin resujltado. El campo se me queda siempre en blanco.

Código:
 obtninv():
   combo1= ttk.Combobox(raiz, width=4, state="readonly" )
   combo1.place(x=220, y = 50)
   #combo1= Entry(textvariable=combo1, width = 4, state="readonly")
   combo1['values']=('AMG', 'AMM', 'MMM')
   
   print(combo1.get())  
 
   messagebox.showwarning("Aviso", combo1.get() )
 
def edit(): edit():
   A)
ninv.get() == combo1.get()
   try:  
         datos= (netapa.get(), ninv.get(), nimporte.get(),nplataforma.get(),nbanco.get(),nfechaor.get(),nfechall.get(),nsituac.get())
 
         cursorObj.execute("UPDATE remesas SET etapa=?, inv=?, importe=?, plataforma=?, banco=?, fechaor=?, fechall=?, situac=? "+ "WHERE  id ="+ nroid,(datos))
 
B)
   B)
   try:  
         
datos= (netapa.get(),combo1.get(), importe.get(),nplataforma.get(),nbanco.get(),nfechaor.get(),nfechall.get(),nsituac.get())
 
         cursorObj.execute("UPDATE remesas SET etapa=?, inv=?, importe=?, plataforma=?, banco=?, fechaor=?, fechall=?, situac=? "+ "WHERE  id ="+ nroid,(datos))

¿Como puedo conseguirlo? Gracias.

Repito el código como lo tengo realmente, gracias.   

Código:
def obtninv():
   combo1= ttk.Combobox(raiz, width=4, state="readonly" )
   combo1.place(x=220, y = 50)
   #combo1= Entry(textvariable=combo1, width = 4, state="readonly")
   combo1['values']=('AMG', 'AMM', 'MMM')
  
    
def edit(): edit():
   A)
ninv.get() == combo1.get()
   try:  
         datos= (netapa.get(), ninv.get(), nimporte.get(),nplataforma.get(),nbanco.get(),nfechaor.get(),nfechall.get(),nsituac.get())
 
         cursorObj.execute("UPDATE remesas SET etapa=?, inv=?, importe=?, plataforma=?, banco=?, fechaor=?, fechall=?, situac=? "+ "WHERE  id ="+ nroid,(datos))
 
B)
   B)
   try:  
         datos= (netapa.get(),combo1.get(), importe.get(),nplataforma.get(),nbanco.get(),nfechaor.get(),nfechall.get(),nsituac.get())
 
         cursorObj.execute("UPDATE remesas SET etapa=?, inv=?, importe=?, plataforma=?, banco=?, fechaor=?, fechall=?, situac=? "+ "WHERE  id ="+ nroid,(datos))
Hola, bienvenido.

Entonces el problema que tenés es que en la base de datos no se está guardando el valor seleccionado por el usuario en el combobox, ¿correcto? En ese caso, ¿el print(combo1.get()) imprime la opción elegida correctamente? ¿Estás obteniendo algún error? Te sugiero que saques el try/except que envuelve al execute() para dejar que se propague cualquier excepción.

Saludos
(09-05-2022, 12:49 AM)Francisco escribió: [ -> ]Hola, bienvenido.

Entonces el problema que tenés es que en la base de datos no se está guardando el valor seleccionado por el usuario en el combobox, ¿correcto? En ese caso, ¿el print(combo1.get()) imprime la opción elegida correctamente? ¿Estás obteniendo algún error? Te sugiero que saques el try/except que envuelve al execute() para dejar que se propague cualquier excepción.

Saludos

Gracias por la respuesta. Pongo manos a la obra. Ya te contaré el resultado.

Efectivamente mi problema es que la opción seleccionada en el combobox no pasa al registro..
Dentro de la función obtninv():
print(combo1.get()) no imprime nada
he quitado el try:
he puesto un messagebox.showwarning("Aviso", combo1.get()) y no aparece este mensaje.

Dentro de la función edit():
he puesto una llamada a obtninv() (donde está el combobox) y el messagebox de edit me dice que el registro se ha modificado correctamente. Así es, todo se ha modificado según he deseado, excepto que el campo que quise modificar  con el combobox sigue en blanco.
¿En qué momento es llamada la función obtninv() o a qué evento está asociada? De seguro estas líneas no deberían estar dentro de la función:

  1. combo1= ttk.Combobox(raiz, width=4, state="readonly" )
  2. combo1.place(x=220, y = 50)
  3. combo1['values']=('AMG', 'AMM', 'MMM')


Esas líneas crean y posicionan el combobox, solo deberían llamarse una vez al principio del programa.

Saludos
Gracias. Aquí va el código:
def obtninv():
    combo1=ttk.Combobox(raiz, width=4 , state="readonly")
    combo1.place(x=220, y=50)
    combo1['values']=('AMG','AMM','MMM') 

    print(combo1.get())

    messagebox.showwarning("Aviso", combo1.get())

def edit():
    conn=sqlite3.connect('inversiones.db')
    cursorObj=conn.cursor()
    nroid=delete_box.get()   # para elegir la Id del registro
    obtninv()
    ninv.get()==combo1.get()     #campo al que desemos aplicar el combobox
    try:
         datos=(netapa.get(), ninv.get(), nbanco.get(), )
         cursorObj.execute("UPDDATE remess SET etapa=?, inv=?, banco=?="+"WHERE ID ="+nroid, (datos) )
         con.commit()
         limpiarTextboxes()
         messagebox.showinfo("Información", "Registro modificado")
    except:
         messagebox.showwarning("Advertencia", "Se produjo un error")
         pass
xxx
He probado no utilizando ninv.get() sino poniendo en datos: combo1.get()
En ninguno de los dos casos coge la modificción. Siempre me da "Registro modificado" y modifica lo que sea, excepto el campo inv que me aparece en blanco. Si no activo el combobox, lo puedo modificar perfectamente.
Aunque el  combobox, cuando lo activo  fuera dela aplicación muestra las tres opciones (aunque no hace el print), cuando lo pongo dentro del programa parece que pasa por él sin reaccionar en absoluto.
Gracias de todos modos y no te calientes mucho la cabeza.
Hola. El problema es que estás creando un nuevo Combobox cada vez que se ejecuta la función obtninv(), por lo cual si el usuario había seleccionado una opción, al crearse de nuevo el control, siempre combo1.get() va a retornar una cadena vacía. Por eso te decía en el mensaje anterior que esas tres líneas correspondientes a la creación del combo no deberían estar en esa función.