Forum >> Principianti >> Farsi restituire un testo in una variabile usando tkinter

Pagina: 1

Salve a tutti,
vorrei creare un form con una casella di testo in cui inserire una parola e questa parola venisse salvata in una variabile che poi vorrei usare più avanti nel codice.

Ho trovato tkinter che farebbe al caso mio usando questo codice che mi stampa quello che scrivo nella casella di testo ma vorrei salvarlo in una variabile per poi usarlo più avanti e mi sto perdendo.

Chiedo cortesemente una dritta per capire come posso risolvere.

Grazie anticipatamente.

import tkinter as tk
root = tk.Tk()
root.geometry("400x240")

def getTextInput():
result=textExample.get("1.0","end")
print(result)

textExample=tk.Text(root, height=10)
textExample.pack()
btnRead=tk.Button(root, height=1, width=10, text="Read",
command=getTextInput)

btnRead.pack()

root.mainloop()
Di per se il discorso sarebbe semplice, dichiari una variabile e ci memorizzi il valore estratto dal widget, questa variante al Tuo codice

import tkinter as tk
from tkinter import messagebox as msg

root = tk.Tk()
root.geometry("400x240")

def get_text_input():
    global text_var
    text_var = textExample.get("1.0","end")

def show_text_var():
    msg.showinfo('Valore Variabile', text_var)
    

textExample=tk.Text(root, height=10)
textExample.pack()
btnRead=tk.Button(root, height=1, width=10, text="Read", command=get_text_input)
btnRead.pack()
btn_show_var = tk.Button(root, text="Mostra text_var", command=show_text_var)
btn_show_var.pack()


text_var = ''

root.mainloop()
permette di leggere il valore del widget Text e di memorizzarlo nella variabile "text_var" con la pressione del pulsante "read", la pressione del tasto "Mostra text_var" ti esporrà il valore memorizzato in una dialog




MA ... le cose non sono mica così semplici, noterai che text_var è utilizzata quale variabile globale (peccato mortale), i framework grafici si usano con paradigmi più articolati di questa esemplificazione, un loro utilizzo efficace richiede una buona conoscenza della base del linguaggio (con particolare approfondimento delle classi) ed una certa infarinatura di OOP e degli eventi che concorrono in una GUI




Edit ho dovuto modificare il nome della Tua funzione perché l'editor di questo Forum dava problemi inserendolo con il nome da Te assegnato



--- Ultima modifica di nuzzopippo in data 2022-07-16 08:30:47 ---

--- Ultima modifica di nuzzopippo in data 2022-07-16 08:31:31 ---
Fatti non foste a viver come bruti...
Ottimo! :ok:
Funziona perfettamente, grazie.

Un'ultima cosa se volessi che dopo aver cliccato il pulsante "read" si chiudesse la finestra , ovviamente lasciando memorizzata la variabile in text_var che altra istruzione dovrei aggiungere.

In pratica cliccando lo stesso bottone si memorizza il valore inserito nella variabile e contestualmente si chiude la finestra.
Da una ricerca mi pare che dovrei usare

Command=root.destroy).pack()



--- Ultima modifica di Jek in data 2022-07-19 22:38:21 ---
Un'ultima cosa se volessi che dopo aver cliccato il pulsante "read" si chiudesse la finestra , ovviamente lasciando memorizzata la variabile in text_var che altra istruzione dovrei aggiungere.
Scrivere qualcosa del genere, dici?import tkinter as tk
from tkinter import messagebox as msg

root = tk.Tk()
root.geometry("400x240")

def get_text_input():
    global text_var
    text_var = textExample.get("1.0","end")
    root.destroy()

def show_text_var():
    msg.showinfo('Valore Variabile', text_var)
    

textExample=tk.Text(root, height=10)
textExample.pack()
btnRead=tk.Button(root, height=1, width=10, text="Read", command=get_text_input)
btnRead.pack()
btn_show_var = tk.Button(root, text="Mostra text_var", command=show_text_var)
btn_show_var.pack()

text_var = ''

root.mainloop() 

print('text_var ora è %s' % text_var)
Si, funzionerebbe ma valgono le considerazioni dette prima, inoltre potresti utilizzare la variabile solo dopo la chiusura del mainloop di tkinter, che è un thread bloccante.
Caricarsi un framework grafico per un semplice input è come usare una bomba atomica per una zanzara, una semplice chiamata alla funzione bult-in "input()" sarebbe molto più pratica.

Altro discorso se la Tua intenzione fosse l'utilizzo di dati definiti in una gui tkinter in un contesto "estraneo" (inteso come esterno) al mainloop che, come detto, è bloccante ... si "potrebbe" fare, per gioco l'ho fatto utilizzando thread ed oggetti singleton implementanti i pattern Publisher/Subscriber, non è una passeggiata però e, comunque, a parte la prova "per gioco" non ho mai trovato un motivo valido per usare realmente tali metodi in qualcosa che faccio.

Pensa bene a ciò che Ti occorre.




Edit : Giusto per darTi una vaga idea di ciò cui andresti incontro, in questo appunto, per mero esercizio, utilizzo il pattern Publisher/subsriber per far comunicare una gui con un gestore dati, da tale base può, con alcuni accorgimenti far comunicare thread separati (di cui uno sia tkinter) ma con diversi ordini di complicazione in più.




Ciao



--- Ultima modifica di nuzzopippo in data 2022-07-21 08:26:13 ---

--- Ultima modifica di nuzzopippo in data 2022-07-21 08:28:31 ---
Fatti non foste a viver come bruti...
Ciao @nuzzopippo ottimo, è proprio come intendevo, grazie ancora. :)
Ho visto il link che mi hai postato e ti faccio i miei complimenti, bel lavoro e chiara spiegazione :ok:
Purtroppo non sono ancora in grado di apprendere ogni passaggio poichè ho molto da imparare di Python.




Comprendo che sto usando forse una "bomba atomica" per una zanzara ma non saprei come fare altrimenti.

Il mio scopo è quello di cerare un programmino distribuendolo in formato .exe (per questo uso auto-py-to-exe) in cui si apre una finestra di ricerca (è quella che voglio usare con tkinter) in cui l'utente scrive la parola che poi elaborerà il programma.




Se lo usassi solo il certamente mi basterebbe una finestra di input ma dovendolo distribuire a altri mi sono dovuto inventare questa modalità.




Il brutto di Python - per quello che ho capito io almeno - è che se devi distribuire un programma per farlo utilizzare a chi non ce l'ha installato è che hai bisogno di altre librerie esterne.


Pagina: 1



Esegui il login per scrivere una risposta.