Pagina 1 di 1

tkinter - immissione testo multirighe

Inviato: venerdì 25 aprile 2014, 12:28
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?

Re: tkinter - immissione testo multirighe

Inviato: venerdì 25 aprile 2014, 21:02
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

Re: tkinter - immissione testo multirighe

Inviato: domenica 27 aprile 2014, 12:22
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?