[Risolto] [Tkinter, MySQL] Trasferire dati da DB a ListboxTk

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

[Risolto] [Tkinter, MySQL] Trasferire dati da DB a ListboxTk

Messaggio da raffaele63 »

Salve a tutti,
prima di tutto vi fornisco le versioni con le quali sto armeggiando:
Python 2.7.6 (default, Mar 22 2014, 22:59:38) [GCC 4.8.2] on linux2;
Your MySQL connection id is 89 Server version: 5.5.43-0ubuntu0.14.04.1 (Ubuntu);
Sono sempre alle prese con il gestionale sportivo e, devo fare in modo di ottenere una serie di dati precedentemente registrati in diverse tabelle di MySQL:
Leggendo alcune soluzioni riportate negli archivi del forum (dall'impiego di diversi Listbox ecc) ho pensato che per le mie esigenze potevo utilizzare PanedWindow di Tkinter, inserire al suo interno alcuni Listbox e ad essi far conferire i dati derivanti dal DB. Purtroppo c'è un qualcosa che non gira per il giusto verso, commetto uno sbaglio ma non riesco a capire dove:

Codice: Seleziona tutto

from Tkinter import *
import MySQLdb

primopaned = PanedWindow()
primopaned.pack(fill = BOTH, expand = 1)

LB1 = Listbox(primopaned, height=15, width=20)
LB1.grid(row =0, column = 0)
primopaned.add(LB1)

conn=MySQLdb.connect(host="XXXXXXX",user="XXXXXXX",passwd="XXXXXXXXXXXX",db="XXXXXXXXXXX")
cursor=conn.cursor()
cursor.execute("""SELECT Partecipanti FROM Evento_sportivo""")
rows=cursor.fetchone() #-------------------------------------------------------------se uso fetchall i dati appaiono tutti su di una riga (NO)
for row in rows:
    LB1.insert(END," ".join([str(i)for i in rows]))
    for row in rows:
        rows=cursor.fetchone()#----------------------------------------<==necessitando di leggerei dati incolonnati ho fatto cosi
        if row != 0:
           LB1.insert(END," ".join([str(i)for i in rows]))#---------------ma ne ritornano solo un piccolo gruppo su 32 nominativi
cursor.close()
conn.close()

LB2 = Listbox(primopaned, height=15, width=20)
LB2.grid(row =0, column = 1)
primopaned.add(LB2)

conn=MySQLdb.connect(host="XXXXX",user="XXXXXX",passwd="XXXXXX",db="XXXXXXXX")
cursor=conn.cursor()
cursor.execute("""SELECT ID_gare FROM Evento_sportivo""")
rows=cursor.fetchone()
for row in rows:
    LB2.insert(END,rows)#--------------------------------qui addirittura solo due su almeno una ventina di dati presenti
    if row != 0:
        rows=cursor.fetchone()
        LB2.insert(END,rows)
cursor.close()
conn.close()

LB3 = Listbox(primopaned, height=15, width=20)
LB3.grid(row =0, column = 2)
LB3.insert(END,' ')
primopaned.add(LB3)

mainloop()
Quello che sto cercando di ottenere:
i dati estrapolati dalle tabelle del DB, inseriti nelle Listbox designate, incolonnati e sopratutto tutti.
Se qualcuno dei lettori, può gentilmente fornirmi spiegazioni del/degli errori che sto commettendo, ne sarei veramente grato.
A presto, Raffaele63
Ultima modifica di raffaele63 il mercoledì 24 giugno 2015, 1:42, modificato 1 volta in totale.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Tkinter, MySQL] Trasferire dati da DB a Listbox di TK

Messaggio da crap0101 »

per la questione di fetchall, direi che non dipende da lui ma da come scrivi i dati ottenuti *dopo*. Inoltre, non so se il codice che usavi con fetchall è uguale a questo in cui usi fetchone, in ogni caso così non va siccome ridefinisci 'rows' nel for interno mentre ci stai ciclando sopra già nel primo (e poi così non penso ti serva, a meno che per qualche strano motivo vuoi proprio il prodotto cartesiano degli elementi della riga).
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Tkinter, MySQL] Trasferire dati da DB a Listbox di TK

Messaggio da raffaele63 »

Salve Crap0101,
se digito:

Codice: Seleziona tutto

cursor=conn.cursor()
cursor.execute("""SELECT IND,Partecipanti FROM Evento_sportivo""")
rows=cursor.fetchone()
for row in rows:
    LB1.insert(END," ".join([str(i)for i in rows]))
cursor.close()
conn.close()
vengono immessi nella Listbox solo il primo nominativo ripetuto 2 volte:
< 1Cognome Nome>
< 1Cognome Nome>
se invece utilizzo:

Codice: Seleziona tutto

cursor=conn.cursor()
cursor.execute("""SELECT IND,Partecipanti FROM Evento_sportivo""")
rows=cursor.fetchone()
for row in rows:
    LB1.insert(END," ".join([str(i)for i in rows]))
    if row != 0:
        LB1.insert(END," ".join([str(i)for i in rows]))
cursor.close()
conn.close()
vengono restituite invece che 2, 4 voci identiche (sempre il primo).
Sto continuando ad andare contro un muro :muro:
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Tkinter, MySQL] Trasferire dati da DB a Listbox di TK

Messaggio da raffaele63 »

Ciao,
ho abbattuto il muro, magari ho contorto un pochino il codice però adesso ottengo tutta la lista di nominativi cercati:

Codice: Seleziona tutto

cursor=conn.cursor()
cursor.execute("""SELECT IND,Partecipanti FROM Evento_sportivo""")
rows=cursor.fetchall()
Partecipanti = []
for row in rows:
    Partecipanti.append(row)
current = 0
if len(Partecipanti) > 0:
    while current < len(Partecipanti):
        LB1.insert(END,' '.join([str(i)for i in(Partecipanti[current])]))
        current = current +1
cursor.close()
conn.close()
sicuramente si potrà fare anche meglio, ma io sono soddisfatto del risultato. Comunque se qualcuno volesse commentare, aggiungere o modificare codice, è il benvenuto. :lol:
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Tkinter, MySQL] Trasferire dati da DB a Listbox di TK

Messaggio da crap0101 »

il problema è che in tutti quei "".join() utilizzi rows invece di row
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto] [Tkinter, MySQL] Trasferire dati da DB a Listb

Messaggio da raffaele63 »

Ciao Crap,
il codice che utilizzo è quello pubblicato nel messaggio (Messaggio da raffaele63 » ieri, 1:40 ).
Rileggendo invece quanto avevo pasticciato in precedenza, ti do ragione, anche se il mio ragionamento per scrivere 'rows' è il seguente:

nomino una variabile con rows = e qui faccio andare il cursore:

per ogni riga presente nella variabile rows, trovata dal cursore:

la inserisci nella listbox, mettendo la prima riga letta, poi l'altra ecc., modificandola con join per una visione senza apici o parentesi, applicando la modifica sia alla prima 'row' o ( i ) che anche alle seguenti contenute nella variabile rows.

Per cortesia, se quanto ti ho scritto non è corretto o se vorresti fornirmi maggiori dettagli su quanto riportato nel tuo messaggio, io resto in attesa e ti ringrazio.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Risolto] [Tkinter, MySQL] Trasferire dati da DB a Listb

Messaggio da crap0101 »

raffaele63 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4773487#p4773487][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ciao Crap,
il codice che utilizzo è quello pubblicato nel messaggio (Messaggio da raffaele63 » ieri, 1:40 ).
Rileggendo invece quanto avevo pasticciato in precedenza, ti do ragione, anche se il mio ragionamento per scrivere 'rows' è il seguente:

nomino una variabile con rows = e qui faccio andare il cursore:

per ogni riga presente nella variabile rows, trovata dal cursore:

la inserisci nella listbox, mettendo la prima riga letta, poi l'altra ecc., modificandola con join per una visione senza apici o parentesi, applicando la modifica sia alla prima 'row' o ( i ) che anche alle seguenti contenute nella variabile rows.

Per cortesia, se quanto ti ho scritto non è corretto o se vorresti fornirmi maggiori dettagli su quanto riportato nel tuo messaggio, io resto in attesa e ti ringrazio.
Non è corretto, ed è il motivo per cui ti ritrovavi con i duplicati.
Usando fetchone() la variabile 'rows' contiene _una_ riga della tabella, per cui i 'row' sui quali cicli, non sono righe ma i campi di quella riga. Usando fetchall() allora sì, 'row' sarebbe effettivamente la riga, ma anche in quel caso non è corretto usare il join così

Codice: Seleziona tutto

for row in rows:
    LB1.insert(END," ".join([str(i)for i in rows]))
perchè in questo modo per ogni riga della tabella inserisci ogni volta *tutta* la tabella (nel caso fetchall restituisca una lista, se restituisce un iteratore lo esaurisci prima).
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto] [Tkinter, MySQL] Trasferire dati da DB a Listb

Messaggio da raffaele63 »

Grazie per la spiegazione. Di volontà ne ho molta, di esperienza in programmazione meno, quindi purtroppo ogni tanto svirgolo.
Adesso utilizzo, per immettere i dati provenienti dal DB nella Listbox, la formula riportata in precedenza con fetchall, anche perchè creo una lista []
ma anche in quel caso non è corretto usare il join così
ecco, qui mi sono un po perso, avrei, per cortesia, bisogno di maggiori info:
perchè in questo modo per ogni riga della tabella inserisci ogni volta *tutta* la tabella
ti riferisci solo al codice che riporti o anche all'altro (cioè quello comunicato successivamente)?
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: [Risolto] [Tkinter, MySQL] Trasferire dati da DB a Listb

Messaggio da crap0101 »

raffaele63 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4774055#p4774055][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Grazie per la spiegazione. Di volontà ne ho molta, di esperienza in programmazione meno, quindi purtroppo ogni tanto svirgolo.
Adesso utilizzo, per immettere i dati provenienti dal DB nella Listbox, la formula riportata in precedenza con fetchall, anche perchè creo una lista []
ma anche in quel caso non è corretto usare il join così
ecco, qui mi sono un po perso, avrei, per cortesia, bisogno di maggiori info:
perchè in questo modo per ogni riga della tabella inserisci ogni volta *tutta* la tabella
ti riferisci solo al codice che riporti o anche all'altro (cioè quello comunicato successivamente)?
se l'altro è questo:

Codice: Seleziona tutto

rows=cursor.fetchall()
Partecipanti = []
for row in rows:
    Partecipanti.append(row)
current = 0
if len(Partecipanti) > 0:
    while current < len(Partecipanti):
        LB1.insert(END,' '.join([str(i)for i in(Partecipanti[current])]))
        current = current +1
no, questo va bene così, l'unica cosa è che la creazione della lista Partecipanti è inutile, ed è molto meglio iterare direttamente su rows.
Non so, penso che tra row e rows ti sei semplicemente confuso un pò con i nomi; invece quest'ultimo codice, anche se corretto, potrebbe essere riscritto più "naturalmente" così:

Codice: Seleziona tutto

rows=cursor.fetchall()
for row in rows:
    LB1.insert(END,' '.join(str(i) for i in row))
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto] [Tkinter, MySQL] Trasferire dati da DB a Listb

Messaggio da raffaele63 »

Ecco, adesso è tutto più chiaro.
Si , in effetti credo proprio che per un semplice errore, io abbia confuso un tantino le carte.
Appena riprendo in mano il gestionale, provo anche la soluzione di non creare le liste.
Ancora grazie per la pazienza e per le spiegazioni. Ciao.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto] [Tkinter, MySQL] Trasferire dati da DB a Listb

Messaggio da raffaele63 »

Rieccomi per l'ultima risposta dovuta.
Purtroppo, alle volte, riesco a commettere piccoli errori, che determinano una lunga serie di prove e generano in me confusione.
L'aver confuso, per la poca esperienza, row con rows, ( quindi una semplice s in più o in meno :D ), o come poco tempo fa aver messo lo stesso 'nome' ad una funzione ed ad una variabile della stessa, mi hanno causato rallentamenti, ma creano esperienza.
A riguardo invece della parte di codice in questa discussione, con l'aiuto di crap0101, ho risolto e riesco ad iterare in modo più semplice e 'naturale' anche nel gestionale sportivo.
Grazie
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti