162 votes

Comment obtenir l'entrée du Widget Texte de Tkinter ?

Comment obtenir une entrée Tkinter à partir du Text widget ?

EDIT

J'ai posé cette question pour aider d'autres personnes ayant le même problème. que est la raison pour laquelle il n'y a pas de code d'exemple. Cette question m'a troublé pendant des heures et j'ai utilisé cette question pour enseigner aux autres. S'il vous plaît ne le notez pas comme s'il s'agissait d'une vraie question - c'est la réponse qui compte.

2voto

bhaskar Points 304

Je pense que c'est une meilleure façon

variable1=StringVar() # Value saved here

def search():
  print(variable1.get())
  return ''

ttk.Entry(mainframe, width=7, textvariable=variable1).grid(column=2, row=1)

ttk.Label(mainframe, text="label").grid(column=1, row=1)

ttk.Button(mainframe, text="Search", command=search).grid(column=2, row=13)

En appuyant sur le bouton, la valeur contenue dans le champ de texte sera imprimée. Mais assurez-vous que vous importez le ttk séparément.

El code complet pour un application de base est-

from tkinter import *
from tkinter import ttk

root=Tk()
mainframe = ttk.Frame(root, padding="10 10 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

variable1=StringVar() # Value saved here

def search():
  print(variable1.get())
  return ''

ttk.Entry(mainframe, width=7, textvariable=variable1).grid(column=2, row=1)

ttk.Label(mainframe, text="label").grid(column=1, row=1)

ttk.Button(mainframe, text="Search", command=search).grid(column=2, row=13)

root.mainloop()

2voto

Michael Guidry Points 2705

Je dirais que la création d'une simple extension de Texte et la transformation text dans une propriété est la manière la plus propre de procéder. Vous pouvez ensuite coller cette extension dans un fichier que vous importez toujours, et l'utiliser à la place de la propriété originale. Text widget. De cette façon, au lieu d'avoir à se souvenir, écrire, répéter, etc. tous les obstacles que tkinter vous fait franchir pour faire les choses les plus simples, vous avez une interface simple comme bonjour qui peut être réutilisée dans n'importe quel projet. Vous pouvez faire cela pour Entry de même, mais la syntaxe est légèrement différente.

import tkinter as tk

root = tk.Tk()    

class Text(tk.Text):
    @property
    def text(self) -> str:
        return self.get('1.0', 'end-1c')

    @text.setter
    def text(self, value) -> None:
        self.replace('1.0', 'end-1c', value)

    def __init__(self, master, **kwargs):
        tk.Text.__init__(self, master, **kwargs)

#Entry version of the same concept as above      
class Entry(tk.Entry):
    @property
    def text(self) -> str:
        return self.get()

    @text.setter
    def text(self, value) -> None:
        self.delete(0, 'end')
        self.insert(0, value)

    def __init__(self, master, **kwargs):
        tk.Entry.__init__(self, master, **kwargs)      

textbox = Text(root)
textbox.grid()

textbox.text = "this is text" #set
print(textbox.text)           #get  

entry = Entry(root)
entry.grid()

entry.text = 'this is text'   #set
print(entry.text)             #get

root.mainloop()

1voto

PythonMan Points 147

Je suis également venu à la recherche de la façon de récupérer les données d'entrée du widget Texte. En ce qui concerne le problème de la nouvelle ligne à la fin de la chaîne. Vous pouvez simplement utiliser .strip() puisque c'est un widget Texte qui est toujours une chaîne.

De plus, je partage un code où vous pouvez voir comment créer de multiples widgets de texte et les enregistrer dans le dictionnaire en tant que données de formulaire, puis, en cliquant sur le bouton d'envoi, récupérer ces données de formulaire et faire ce que vous voulez avec. J'espère que cela aidera d'autres personnes. Il devrait fonctionner dans n'importe quel python 3.x et probablement aussi en 2.7.

from tkinter import *
from functools import partial

class SimpleTkForm(object):
    def __init__(self):
        self.root = Tk()

    def myform(self):
        self.root.title('My form')
        frame = Frame(self.root, pady=10)
        form_data = dict()
        form_fields = ['username', 'password', 'server name', 'database name']
        cnt = 0
        for form_field in form_fields:
            Label(frame, text=form_field, anchor=NW).grid(row=cnt,column=1, pady=5, padx=(10, 1), sticky="W")
            textbox = Text(frame, height=1, width=15)
            form_data.update({form_field: textbox})
            textbox.grid(row=cnt,column=2, pady=5, padx=(3,20))
            cnt += 1

        conn_test = partial(self.test_db_conn, form_data=form_data)
        Button(frame, text='Submit', width=15, command=conn_test).grid(row=cnt,column=2, pady=5, padx=(3,20))
        frame.pack()
        self.root.mainloop()

    def test_db_conn(self, form_data):
        data = {k:v.get('1.0', END).strip() for k,v in form_data.items()}
        # validate data or do anything you want with it
        print(data)

if __name__ == '__main__':
    api = SimpleTkForm()
    api.myform()

-3voto

Disons que vous avez un Text widget appelé my_text_widget .

A obtenir l'apport de la my_text_widget vous pouvez utiliser le get fonction.

Supposons que vous ayez importé tkinter . Définissons my_text_widget Tout d'abord, faisons en sorte que ce soit un simple widget texte.

my_text_widget = Text(self)

A obtenir l'entrée d'un text vous devez utiliser l'option get fonction, les deux, text y entry Les widgets ont ceci.

input = my_text_widget.get()

Si nous l'enregistrons dans une variable, c'est pour l'utiliser dans la suite du processus, par exemple pour vérifier quelle est l'entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X