tkinter - immissione testo multirighe

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

tkinter - immissione testo multirighe

Messaggio da maresama »

Mentre la variazione di un testo di una riga è molto semplice, non trovo la soluzione per l'immissione di un testo multirighe (testo libero)
Questo è la funzione che ho fatto:

Codice: Seleziona tutto


from Tkinter import *
def xxxx(titolo, desc,testo):
    root=Tk()
    root.title(titolo) 
    root.maxsize(width=1266, height=300)
    txt=Text(root,width=80, height=10,pady=15,padx=10)
    txt.insert(END,testo)                   
    txt.grid(row=6)
    txt.focus()
    txt.pack()
    lb1= Label(root,text=desc, fg="blue",font=("Arial Black",10,"")) 
    lb1.pack()
    lb2= Label(root,text="",   fg="blue",font=("Arial Black",10,""))
    lb2.pack()
    button = Button(lb2, text=" Conferma ", font=("Arial black",8,"bold"), bg="green",command=root.destroy, bd=3, padx=30, pady=10)
    button.pack()
    root.mainloop()
    return testo

desc="aaaaa ccccc"
testo="testo in fase di partenza\n(di più righe)\nda modificare"
titolo="testo da digitare"
testo=xxxx(titolo, desc,testo)
print testo
Come va modificato per poter avere in output il testo modificato?
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 - immissione testo multirighe

Messaggio da crap0101 »

maresama ha scritto:

Codice: Seleziona tutto


from Tkinter import *
def xxxx(titolo, desc,testo):
    root=Tk()
    root.title(titolo) 
    root.maxsize(width=1266, height=300)
    txt=Text(root,width=80, height=10,pady=15,padx=10)
    txt.insert(END,testo)                   
    # [...]
    button = Button(lb2, text=" Conferma ", font=("Arial black",8,"bold"), bg="green",command=root.destroy, bd=3, padx=30, pady=10) # XXX
    button.pack()
    root.mainloop()
    return testo  # XXX

desc="aaaaa ccccc"
testo="testo in fase di partenza\n(di più righe)\nda modificare"
titolo="testo da digitare"
testo=xxxx(titolo, desc,testo)
print testo
non va bene per un paio di motivi, innanzitutto 'testo' è una stringa, *immutabile*, per cui ti verrà restituita sempre quella stessa identica che hai passato alla funzione.
Quando metti 'testo' nel widget (ed eventualmente lo modifichi) poi devi prenderlo sempre da lui (usando il metodo get(), btw).
Altra cosa, devi farlo *prima* di distruggere tutto, per cui devi legare l'azione del pulsante anche a questa azione prima di chiamare destroy su root. Probabilmente ti servirà usare una StringVar, o almeno è la soluzione più comoda che mi è venuta in mente buttando giù al volo ste due righe:

Codice: Seleziona tutto

crap0101@orange:/tmp/FOO$ cat x.py
#coding: utf-8

from Tkinter import *

def _destroy (root, txt, str):
    def doit ():
        str.set(txt.get('1.0', END))
        root.destroy()
    return doit

def xxxx(titolo, desc,testo):
    root=Tk()
    root.title(titolo)
    root.maxsize(width=1266, height=300)
    strtxt = StringVar()
    txt=Text(root,width=80, height=10,pady=15,padx=10)
    txt.insert(END,testo)                   
    txt.grid(row=6)
    txt.focus()
    txt.pack()
    lb1= Label(root,text=desc, fg="blue",font=("Arial Black",10,""))
    lb1.pack()
    lb2= Label(root,text="",   fg="blue",font=("Arial Black",10,""))
    lb2.pack()
    button = Button(lb2, text=" Conferma ", font=("Arial black",8,"bold"), bg="green",command=_destroy(root,txt,strtxt), bd=3, padx=30, pady=10)
    button.pack()
    root.mainloop()
    return strtxt.get()

desc="aaaaa ccccc"
testo="testo in fase di partenza\n(di più righe)\nda modificare"
titolo="testo da digitare"
testo=xxxx(titolo, desc,testo)
print testo
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
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: tkinter - immissione testo multirighe

Messaggio da maresama »

Grazie Crap
Ero arrivato anche io a un soluzione equivalente, ma quello che mi sta facendo impazzire è che se metto un certo numero di righe (ad esempio 1), in scrittura si possono farne di più (numero righe corrisponde al numero di righe visibili, ma non bloccano la scrittura oltre.
Ho tentato intercettando il tasto return, ma non ci sono riuscito. Vedi qualche soluzione?
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti