Foros Python

Versión completa: Insertar en Entry según el valor de un Combobox (tkinter)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Buenas, tengo una duda simple (creo).
Tengo un programa que almacena en una base dos campos: "código" y "color" (a cada código le corresponde un color) que son cargados manualmente por el usuario.
Se me ocurrió poner un combobox en el campo color para que el usuario no necesite recordar los códigos de color, pero me gustaría que al seleccionar un color desde el combobox, el entry del código muestre el valor del código del mismo.
¿Cómo es posible hacerlo?
(13-07-2022, 08:17 AM)Diego escribió: [ -> ]Buenas, tengo una duda simple (creo).
Tengo un programa que almacena en una base dos campos: "código" y "color" (a cada código le corresponde un color) que son cargados manualmente por el usuario.
Se me ocurrió poner un combobox en el campo color para que el usuario no necesite recordar los códigos de color, pero me gustaría que al seleccionar un color desde el combobox, el entry del código muestre el valor del código del mismo.
¿Cómo es posible hacerlo?

Buenas, no tengo muy claro que GUI estás utilizando para crear el combobox y el entry( Tkinter, QT, GTK+.....). Yo te puedo ayudar si estás usando Tkinter.

En tkinter tendrías que "bindear" la función para que al selecionar un color en el combobox te añada el código en el entry mediante el acceso a la base de datos que tampoco tengo claro si usas postgresql, sqlite u otra.

Quedaría algo así:

self.combobox.bind('<<ComboboxSelected>>', "función para insertar el código en el entry").

P.D. Lo siento ahora no tengo mucho tiempo ahora para crearte el código entero.(A ver si luego puedo).
(13-07-2022, 08:27 AM)Myszowor escribió: [ -> ]
(13-07-2022, 08:17 AM)Diego escribió: [ -> ]Buenas, tengo una duda simple (creo).
Tengo un programa que almacena en una base dos campos: "código" y "color" (a cada código le corresponde un color) que son cargados manualmente por el usuario.
Se me ocurrió poner un combobox en el campo color para que el usuario no necesite recordar los códigos de color, pero me gustaría que al seleccionar un color desde el combobox, el entry del código muestre el valor del código del mismo.
¿Cómo es posible hacerlo?

Buenas, no tengo muy claro que GUI estás utilizando para crear el combobox y el entry( Tkinter, QT, GTK+.....). Yo te puedo ayudar si estás usando Tkinter.

En tkinter tendrías que "bindear" la función para que al selecionar un color en el combobox te añada el código en el entry mediante el acceso a la base de datos que tampoco tengo claro si usas postgresql, sqlite u otra.

Quedaría algo así:

self.combobox.bind('<<ComboboxSelected>>', "función para insertar el código en el entry").

P.D. Lo siento ahora no tengo mucho tiempo ahora para crearte el código entero.(A ver si luego puedo).

Hola, sí, omití eso, perdón. Estoy utilizando tkinter con sqlite3. Y no estoy utilizando POO. De todas maneras justamente lo que no me sale es la parte de "función para insertar el código en el entry". Debe ser algo fácil que no veo, pero no logro que el valor aparezca en el entry.
(13-07-2022, 06:05 PM)Diego escribió: [ -> ]
(13-07-2022, 08:27 AM)Myszowor escribió: [ -> ]
(13-07-2022, 08:17 AM)Diego escribió: [ -> ]Buenas, tengo una duda simple (creo).
Tengo un programa que almacena en una base dos campos: "código" y "color" (a cada código le corresponde un color) que son cargados manualmente por el usuario.
Se me ocurrió poner un combobox en el campo color para que el usuario no necesite recordar los códigos de color, pero me gustaría que al seleccionar un color desde el combobox, el entry del código muestre el valor del código del mismo.
¿Cómo es posible hacerlo?

Buenas, no tengo muy claro que GUI estás utilizando para crear el combobox y el entry( Tkinter, QT, GTK+.....). Yo te puedo ayudar si estás usando Tkinter.

En tkinter tendrías que "bindear" la función para que al selecionar un color en el combobox te añada el código en el entry mediante el acceso a la base de datos que tampoco tengo claro si usas postgresql, sqlite u otra.

Quedaría algo así:

self.combobox.bind('<<ComboboxSelected>>', "función para insertar el código en el entry").

P.D. Lo siento ahora no tengo mucho tiempo ahora para crearte el código entero.(A ver si luego puedo).

Hola, sí, omití eso, perdón. Estoy utilizando tkinter con sqlite3. Y no estoy utilizando POO. De todas maneras justamente lo que no me sale es la parte de "función para insertar el código en el entry". Debe ser algo fácil que no veo, pero no logro que el valor aparezca en el entry.
A ver te intento poner un ejemplo sencillito para que tú luego lo desarrolles asociando tu base de datos.

Código:
def imprimir:
   
    x = self.comb1.get()

    if x == 'Azul':
        self.ent1.delete('0', tk.END)
        self.ent1.insert('0', "Código Azul")
   
    elif x =='Verde':
        self.ent1.delete('0'), tk.END)
        self.ent1.insert('0', "Código Verde")


self.ent1 = ttk.Entry()
self.ent1.grid()

self.comb1 = ttk.Combobox()
self.comb1.grid()
self.comb1["values"] = ['Azul', 'Rojo', 'Verde']
self.comb1.bind('<<ComboboxSelected>>', 'imprimir')


P.D. Es un ejemplo un poco burdo pero más o menos es para que veas como funciona el <<ComboboxSelected>>.

P.D.D. El delete del entry es para que cada vez que elijas un color, te modifique el texto del entry. De lo contrario te añadiría una y otra vez el texto al que ya hay.

P.D.D.D. Me suelo explicar como un libro cerrado. Perdonarme......
(14-07-2022, 08:27 AM)Myszowor escribió: [ -> ]
(13-07-2022, 06:05 PM)Diego escribió: [ -> ]
(13-07-2022, 08:27 AM)Myszowor escribió: [ -> ]
(13-07-2022, 08:17 AM)Diego escribió: [ -> ]Buenas, tengo una duda simple (creo).
Tengo un programa que almacena en una base dos campos: "código" y "color" (a cada código le corresponde un color) que son cargados manualmente por el usuario.
Se me ocurrió poner un combobox en el campo color para que el usuario no necesite recordar los códigos de color, pero me gustaría que al seleccionar un color desde el combobox, el entry del código muestre el valor del código del mismo.
¿Cómo es posible hacerlo?

Buenas, no tengo muy claro que GUI estás utilizando para crear el combobox y el entry( Tkinter, QT, GTK+.....). Yo te puedo ayudar si estás usando Tkinter.

En tkinter tendrías que "bindear" la función para que al selecionar un color en el combobox te añada el código en el entry mediante el acceso a la base de datos que tampoco tengo claro si usas postgresql, sqlite u otra.

Quedaría algo así:

self.combobox.bind('<<ComboboxSelected>>', "función para insertar el código en el entry").

P.D. Lo siento ahora no tengo mucho tiempo ahora para crearte el código entero.(A ver si luego puedo).

Hola, sí, omití eso, perdón. Estoy utilizando tkinter con sqlite3. Y no estoy utilizando POO. De todas maneras justamente lo que no me sale es la parte de "función para insertar el código en el entry". Debe ser algo fácil que no veo, pero no logro que el valor aparezca en el entry.
A ver te intento poner un ejemplo sencillito para que tú luego lo desarrolles asociando tu base de datos.

Código:
def imprimir:
   
    x = self.comb1.get()

    if x == 'Azul':
        self.ent1.delete('0', tk.END)
        self.ent1.insert('0', "Código Azul")
   
    elif x =='Verde':
        self.ent1.delete('0'), tk.END)
        self.ent1.insert('0', "Código Verde")


self.ent1 = ttk.Entry()
self.ent1.grid()

self.comb1 = ttk.Combobox()
self.comb1.grid()
self.comb1["values"] = ['Azul', 'Rojo', 'Verde']
self.comb1.bind('<<ComboboxSelected>>', 'imprimir')


P.D. Es un ejemplo un poco burdo pero más o menos es para que veas como funciona el <<ComboboxSelected>>.

P.D.D. El delete del entry es para que cada vez que elijas un color, te modifique el texto del entry. De lo contrario te añadiría una y otra vez el texto al que ya hay.

P.D.D.D. Me suelo explicar como un libro cerrado. Perdonarme......

Perfecto, te muestro lo que hice yo.

La línea del entry, me quedó así:
color['values']=combo_input()

O sea, que me lleva a la función combo_input que es esta (porque los colores son dinámicos, no es un listado fijo, se van agregando):
def combo_input():
    cursor=base.cursor()
    query = ('SELECT color FROM temples')
    cursor.execute(query)
    data=[]
    for rows in cursor:
        data.append(rows[0])
   
    return(data)


Esta función debería referenciar a otra que genere la consulta en la base para devolver el código de color.
Y ahí es donde no me sale.
Debería ser algo así como (en seudo código navajo):
def selecc_codigo_color():
      cursor=base.cursor()
    color=data
    sql = ('SELECT código FROM temples WHERE color=?')
    cursor.execute(data, sql)

Y ya no sé más. Porque ahora vendría la parte en la que le indico que el resultado de la consulta del select la inserte en el entry.
Se me ocurre agregarle:
codigo=insert(cursor)
Pero no sé. Estoy en ascuas.
Hola, Diego.

Después del execute() deberías hacer algo como esto:

Código:
# Obtener el color retornado por la consulta.
color = cursor.fetchone()[0]
# Borrar el texto anterior.
entry_codigo.delete(0, tk.END)
# Insertarlo en la caja de texto.
entry_codigo.insert(0, color)

Saludos
Francisco, lo intenté (juro que lo intenté) pero me arroja el siguiente error:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 40 supplied.

Seguramente estoy haciendo algo de mala manera, pero no lo encuentro.
Me tomo el atrevimiento de dejarles el .py  (tuve que zipearlo, no me dejaba subir el .py) para que puedan ver en qué lugar estoy cometiendo el error.
Gracias.
Hola, Diego.

Esta línea

Código:
cursor.execute(data, sql)

está al revés, primero va la consulta y después los parámetros en una tupla o lista. Debería ser:

Código:
cursor.execute(sql, [data])

Saludos
Tenés toda la razón. Invertí ese orden. Ahora lo corregí pero me cambió el mensaje de error por este:

colores = cursor.fetchone()[0]

TypeError: 'NoneType' object is not subscriptable


¿? ¿Qué me está diciendo?
La consulta SQL no te está devolviendo ningún resultado, deberías chequear eso antes:

Código:
result = cursor.fetchone()
if result is not None:
    color = result[0]
    # ...

Por cierto, si la consulta puede devolver muchos colores, deberías usar fetchall() en lugar de fetchone().

Saludos
Páginas: 1 2