Domanda Python, collegare due combobox con un database, per far corrispondere una determinata voce del primo ad una diversa voce del secondo combobox

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Ultima modifica:
Salve a tutti. Vorrei fare in modo che selezionando, ad esempio, una Regione in un combobox, nel combobox vicino escano i nomi delle Città "relative ad ogni regione selezionata". Ad esempio seleziono Lazio e mi esce Roma, Frosinone, Rieti, Latina, ecc.

Ho creato già il database (sql lite), ma non riesco a fare il modo che nel secondo combobox (Città) escano le città della Regione selezionata nel primo combobox. Non sono molto pratico di Python. Come posso fare? Grazie

Codice:
### DATABASE CHE LEGGE LE REGIONI ###
con = sqlite3.connect('/home/miopc/Scrivania/Database_SQLLite.db')
cursor = con.cursor()
cursor.execute('SELECT DISTINCT Regione FROM Info')
elenco1 = cursor.fetchall()
con.close()

### COMBOBOX REGIONI ###
regioni=ttk.Combobox(window,width=13)
regioni.place(x=5, y=190)
regioni['values'] = elenco1
regioni.current(0)

### DATABASE CHE LEGGE LE CITTA'###
con = sqlite3.connect('/home/miopc/Scrivania/Database_SQLLite.db')
cursor = con.cursor()
cursor.execute('SELECT Citta FROM Info WHERE Regione')
elenco2 = cursor.fetchall()
con.close()

### COMBOBOX CITTA ###
citta=ttk.Combobox(window,width=13)
citta.place(x=5, y=230)
citta['values'] = elenco2
citta.current(0)
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
Credo il problema sia in SQL (?)
Codice:
cursor.execute('SELECT Citta FROM Info WHERE Regione')

Dovresti specificare la regione di cui vuoi le citta', ad esempio:

Codice:
cursor.execute('SELECT Citta FROM Info WHERE Regione=='Lazio'')

Se dovesse darti errori di qualche tipo, conviene sempre pubblicare anche l'errore riportato
 
  • Mi piace
Reazioni: antonio92x

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Credo il problema sia in SQL (?)
Codice:
cursor.execute('SELECT Citta FROM Info WHERE Regione')

Dovresti specificare la regione di cui vuoi le citta', ad esempio:

Codice:
cursor.execute('SELECT Citta FROM Info WHERE Regione=='Lazio'')

Se dovesse darti errori di qualche tipo, conviene sempre pubblicare anche l'errore riportato
Nel primo combobox ci sono tutte le regioni d'Italia naturalmente. Quindi nel mio caso non va bene specificare solo una determinata regione in cursor.execute('SELECT Citta FROM Info WHERE Regione=='Lazio''). Come posso fare? Grazie ancora
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
Usando la funzione format(), ti propongo una prima soluzione:

cursor.execute('SELECT Citta FROM Info WHERE Regione=='{0}').format(regione)


Ovviamente regione e' una variabile, il cui valore rappresenta la scelta del primo combobox da parte dell'utente
 
  • Mi piace
Reazioni: antonio92x

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Ultima modifica:
Usando la funzione format(), ti propongo una prima soluzione:

cursor.execute('SELECT Citta FROM Info WHERE Regione=='{0}').format(regione)


Ovviamente regione e' una variabile, il cui valore rappresenta la scelta del primo combobox da parte dell'utente
Provato! Quando clicco su Run Module non si apre e si seleziona di rosa la prima parentesi quadra che hai scritto (solo la parentesi quadra, senza ' o 0). Esce scritto Invalid Syntax
 

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Ultima modifica:
Si scusa,
cursor.execute('SELECT Citta FROM Info WHERE Regione=='{0}''.format(regione))
Figurati, anzi grazie ancora. Però mi esce lo stesso messaggio di errore. Sempre allo stesso punto sulla prima parentesi graffa

AGGIUNGO: Riuscendo a risolvere questa cosa, quindi, il combobox2 delle Città sarà automaticamente collegato al combobox1 delle Regioni come da codice postato all'inizio? Cioè che seleziono ad esempio Lombardia nel combobox 1 e nel combobox 2 mi usciranno Milano, Monza, Bergamo, ecc?

P.S: Se ti serve saperlo, Città e Regione si trovano nella stessa tabella Info
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
Sono completamente arrugginito scusami

Un solo simbolo di =

Comunque il risultato ottenuto dipende poi dal database, se creato correttamente si', avrai quel risultato

Fammi sapere ovviamente!
 
  • Mi piace
Reazioni: antonio92x

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Non ti preoccupare, anzi grazie per l'aiuto. Purtroppo riscontro ancora lo stesso problema. Errore di sintassi che evidenza la prima parentesi graffa. Hai qualche altra soluzione?
 

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Inserisco sia lo screenshot che le righe. Ho provato a scrivere la riga in tutti i modi che mi hai gentilmente suggerito, ma riscontro sempre lo stesso identico problema. Non so se è importante, ma per curiosità ho provato a scrivere SELECT Citta FROM Info WHERE Regione= "Lazio" e nel secondo combobox quindi, mi escono regolarmente tutte le città del Lazio (nel primo combobox invece l'elenco di tutte le regioni d'italia). Quindi non credo sia un problema del database in quanto con una determinata Regione funziona.

Codice:
con = sqlite3.connect('/home/antonio/Scrivania/Database_SQLLite.db')
cursor = con.cursor()
cursor.execute('SELECT Citta FROM Info WHERE Regione='{0}''.format(regione))
elenco2 = cursor.fetchall()
con.close()

Schermata del 2021-06-10 17-05-29.png
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
cursor.execute("SELECT Citta FROM Info WHERE Regione=\'{0}\' ".format(regione))

Prova cosi', ho sbagliato a scrivere in quel modo perche' separa le stringhe. (Quando non programmi piu' da un po' ti dimentichi ogni cosa D: )
 

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
cursor.execute("SELECT Citta FROM Info WHERE Regione=\'{0}\' ".format(regione))

Prova cosi', ho sbagliato a scrivere in quel modo perche' separa le stringhe. (Quando non programmi piu' da un po' ti dimentichi ogni cosa D: )
Beh, certo, è normale non ricordare delle cose quando non programmi da un pò. Comunque adesso non mi da un errore di sintassi. Il form si apre normalmente, però il secondo combobox è vuoto. Ossia nel primo combobox seleziono una regione (ad esempio Lazio), ma il secondo combobox (dove dovrebbero uscire i nomi della città del Lazio) è vuoto
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
Perfetto, prova a stampare la variabile "regione" che poi andra' nella query che abbiamo appena sistemato, cosi' vediamo se il valore e' impostato o meno e cerchiamo di capire dove sia l'errore

Basta quindi un semplice:

print(regione)

prima o dopo la riga appena modificata
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
Allora l'errore e' nell'assegnare il valore del combobox ad una variabile

Posta per favore il codice del combobox (nei tag
Codice:
 possibilmente, cosi' e' piu' leggibile)
 

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Ultima modifica:
@fisica-all Però scrivendo così SELECT Citta FROM Info WHERE Regione= "Lazio" riferito ad una determinata regione, funziona bene. Posto l'intero codice, come scritto all'inizio del post (questo è il copia e incolla senza il rigo da te gentilmente suggerito). Ecco:

Codice:
### DATABASE CHE LEGGE LE REGIONI ###
con = sqlite3.connect('/home/miopc/Scrivania/Database_SQLLite.db')
cursor = con.cursor()
cursor.execute('SELECT DISTINCT Regione FROM Info')
elenco1 = cursor.fetchall()
con.close()

### COMBOBOX REGIONI ###
regioni=ttk.Combobox(window,width=13)
regioni.place(x=5, y=190)
regioni['values'] = elenco1
regioni.current(0)

### DATABASE CHE LEGGE LE CITTA'###
con = sqlite3.connect('/home/miopc/Scrivania/Database_SQLLite.db')
cursor = con.cursor()
cursor.execute('SELECT Citta FROM Info WHERE Regione')
elenco2 = cursor.fetchall()
con.close()

### COMBOBOX CITTA ###
citta=ttk.Combobox(window,width=13)
citta.place(x=5, y=230)
citta['values'] = elenco2
citta.current(0)
 

antonio92x

Utente Bronze
6 Giugno 2019
69
14
6
31
Ultima modifica:
Manca il binding del combobox, ovvero una funzione chiamata quando viene selezionata una regione.
Guarda qui: https://stackoverflow.com/questions/31264522/getting-the-selected-value-from-combobox-in-tkinter
@fisica-all Ah ecco. Però non è proprio il mio caso, inoltre non avendolo mai usato il bind, puoi mostrarmi il codice per come inserirlo nel mio caso per favore? Mi permetto di chiedertelo perchè ho visto che nell'esempio che mi hai cortesemente riportato, ci capisco poco e niente. Grazie
 

fisica-all

Utente Jade
13 Aprile 2014
1,427
162
331
914
Puoi anche semplicemente fare una get da quello che leggo, quindi qualcosa del tipo:

cursor.execute("SELECT Citta FROM Info WHERE Regione='{0}'").format(combobox.get())

per sicurezza stampa, come consigliato prima, il valore del combobox.get() , in modo da capire se effettivamente funziona