Python e comando entry

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
carm960
Prode Principiante
Messaggi: 35
Iscrizione: sabato 6 maggio 2017, 2:06
Desktop: ubuntustudio
Distribuzione: Ubuntu 17.04 - x86_64
Sesso: Maschile
Località: Napoli

Python e comando entry

Messaggio da carm960 »

Salve,

sono alla ricerca di esempi in python di un form / frame / finestra, con colonna di entry in cui ci si sposta col tasto enter, tab e frecce, fin ora non sono riuscito a trovare nulla del genere, Spero mi possiate indicare qualcosa che mi possa aiutare nella realizzazione di questo tipo di progetto.
Grazie in anticipo.
gianmarcosub
Prode Principiante
Messaggi: 4
Iscrizione: martedì 9 maggio 2017, 20:58
Sesso: Maschile

Re: Python e comando entry

Messaggio da gianmarcosub »

Ciao ti conviene cercare dei programmi fatti con il modulo tkinter su internet, ne trovi parecchi e ti sposti con il tasto tabulazione

ciao!
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python e comando entry

Messaggio da Claudio_F »

In tk Il TAB è automatico, frecce e invii vanno gestiti manualmente tramite apposite callback. Ad esempio:

Codice: Seleziona tutto

import Tkinter as tk

#------------------------------------------------------

def on_down(evt):
    i = evt.widget.fr_index
    if i < len(elist) - 1:  elist[i+1].focus_force()
    else:                   elist[0].focus_force()

#------------------------------------------------------

def on_up(evt):
    i = evt.widget.fr_index
    if i > 0:  elist[i-1].focus_force()
    else:      elist[-1].focus_force()

#------------------------------------------------------

root = tk.Tk()

fr = tk.Frame(root)
fr.pack(padx=0, pady=2)
elist = [tk.Entry(fr, width=20) for _ in range(10)]
for n, e in enumerate(elist): 
    e.fr_index = n   # <--- monkey patch
    e.bind('<Return>', on_down)
    e.bind('<Down>', on_down)
    e.bind('<Up>', on_up)
    e.pack(padx=4, pady=2)

elist[0].focus_force()
root.mainloop()
carm960
Prode Principiante
Messaggi: 35
Iscrizione: sabato 6 maggio 2017, 2:06
Desktop: ubuntustudio
Distribuzione: Ubuntu 17.04 - x86_64
Sesso: Maschile
Località: Napoli

Re: Python e comando entry

Messaggio da carm960 »

Grazie, mi studierò l'esempio.
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: Python e comando entry

Messaggio da maresama »

E' un esempio molto bello perchè è anche molto semplice.
Chiedo scusa se mi intrometto.
Dovrei proprio fare una cosa del genere ma dovrei poter precaricare (con 2 input) sia delle diciture da anteporre (e non modificabili) davanti ogni riga
e precaricare già dei valori.
Naturalmente vorrei in output solo i valori (di partenza o modificati)
Come dovrei fare?
Grazie ... e scusate l'intromissione.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python e comando entry

Messaggio da Claudio_F »

Qualcosa del genere?

Codice: Seleziona tutto

import Tkinter as tk

#------------------------------------------------------

def on_down(evt):
    i = evt.widget.fr_index
    if i < len(elist) - 1:
        elist[i+1].focus_force()
        elist[i+1].selection_range('0', 'end')
    else:
        elist[0].focus_force()
        elist[0].selection_range('0', 'end')

#------------------------------------------------------

def on_up(evt):
    i = evt.widget.fr_index
    if i > 0:
        elist[i-1].focus_force(); 
        elist[i-1].selection_range('0', 'end')
    else:
        elist[-1].focus_force();
        elist[-1].selection_range('0', 'end')

#------------------------------------------------------

dati = (
    ('NomeCampo1:', 'ValoreIniziale1'), 
    ('NomeCampo2:', 'ValoreIniziale2'),
    ('NomeCampo3:', 'ValoreIniziale3'),
    ('NomeCampo4:', 'ValoreIniziale4'),
    ('NomeCampo5:', 'ValoreIniziale5'),
)

root = tk.Tk()
fr = tk.Frame(root)
fr.pack(pady=2, padx=2)

elist = []
for n, d in enumerate(dati):
    fri = tk.Frame(fr)
    fri.pack()
    lb = tk.Label(fri, text=d[0], anchor='w')
    lb.pack(side='left')
    e = tk.Entry(fri, width=20)
    e.insert('0', d[1])
    e.fr_index = n   # <--- monkey patch
    e.bind('<Return>', on_down)
    e.bind('<Down>', on_down)
    e.bind('<Up>', on_up)
    e.pack(side='left')
    elist.append(e)

elist[0].focus_force()
elist[0].selection_range('0', 'end')
root.mainloop()
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: Python e comando entry

Messaggio da maresama »

Si, Cosi!
ma come estraggo il risultato (solo dati) se fatte modifiche?
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python e comando entry

Messaggio da Claudio_F »

Le entry sono contenute nella lista 'elist', quindi per ciascuna basta chiamare il metodo .get
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: Python e comando entry

Messaggio da maresama »

avevo già provato con
....
root.mainloop()
for x in elist:
print x.get()

ma non è cosi.... perchè?
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: Python e comando entry

Messaggio da maresama »

Naturalmente funziona se faccio:
def esci(x):
w=[]
for x in elist:
print x.get();
root.destroy()
dopo aver inserito bind button
Oppure veramente si può avere il risultato senza aggiungere una funzione per l'uscita? ( ad esempio gestendo solo l'uscita con 'X')

altra cosa che non riesco a fare (per prevedere un tasto ripristina riga)
def ripr(evt):
i = evt.widget.fr_index; print 666
e.delete(0, END)
e.insert(0, "xxxxxxx")
come faccio a variare la riga i anzichè l'ultima?
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: Python e comando entry

Messaggio da Claudio_F »

maresama ha scritto:Oppure veramente si può avere il risultato senza aggiungere una funzione per l'uscita? ( ad esempio gestendo solo l'uscita con 'X')
Con questo si può chiamare la funzione anche cliccando sulla X:

Codice: Seleziona tutto

root.protocol('WM_DELETE_WINDOW', esci)
root.mainloop()
altra cosa che non riesco a fare (per prevedere un tasto ripristina riga)

Codice: Seleziona tutto

    def ripr(evt):
        i = evt.widget.fr_index; print 666
        e.delete(0, END)
        e.insert(0, "xxxxxxx")
come faccio a variare la riga i anzichè l'ultima?
'e' identifica l'ultima Entry creata, in quella funzione la Entry corretta è identificata da evt.widget

avevo già provato con

Codice: Seleziona tutto

root.mainloop()
for x in elist:
print x.get()
ma non è cosi.... perchè?
Perché la distruzione della finestra distrugge tutti gli elementi che la compongono e i loro valori, un'alternativa è usare quit al posto di destroy, in tal caso il mainloop si ferma ma tutti gli elementi sono ancora presenti in memoria, infatti il mainloop può essere riavviato e la finestra ricompare come prima:

Codice: Seleziona tutto

def fine(evt=None):
    print 'bye bye'
    root.quit()

.....

root.protocol("WM_DELETE_WINDOW", fine)
root.mainloop()

for x in elist:
    print x.get()

root.mainloop()
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: Python e comando entry

Messaggio da maresama »

Come sempre non ti limiti a risolvere il problema, ma spieghi anche dove sbagliamo e come si deve fare...
Sei un grande!
Ho fatto come hai suggerito e va tutto bene
Sia il ripristino della riga
Sia l'uscita con x (usando root.protocol("WM_DELETE_WINDOW", )
Grazie.
Ciao...
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 12 ospiti