web-dev-qa-db-fra.com

Pourquoi la fonction get de Tkinter Entry ne renvoie-t-elle rien?

J'essaie d'utiliser un champ Entry pour obtenir une entrée manuelle, puis je travaille avec ces données.

Toutes les sources que j'ai trouvées prétendent que je devrais utiliser la fonction get(), mais je n'ai pas encore trouvé un mini exemple de travail simple, et je ne peux pas le faire fonctionner.

J'espère que quelqu'un pourra me dire ce que je fais mal. Voici un mini fichier:

from tkinter import *


master = Tk()

Label(master, text="Input: ").grid(row=0, sticky=W)

entry = Entry(master)
entry.grid(row=0, column=1)

content = entry.get()
print(content)  # does not work

mainloop()

Cela me donne un champ Entry que je peux saisir, mais je ne peux rien faire avec les données une fois saisies.

Je soupçonne que mon code ne fonctionne pas car initialement, entry est vide. Mais comment puis-je accéder aux données d'entrée une fois qu'elles ont été saisies?

19
CodingCat

Il semble que vous puissiez être confus quant à l'exécution des commandes. Dans votre exemple, vous appelez la méthode get avant que l'interface graphique ait une chance d'être affichée à l'écran (ce qui se produit après avoir appelé mainloop.

Essayez d'ajouter un bouton qui appelle la méthode get. C'est beaucoup plus facile si vous écrivez votre application en tant que classe. Par exemple:

import tkinter as tk

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.entry = tk.Entry(self)
        self.button = tk.Button(self, text="Get", command=self.on_button)
        self.button.pack()
        self.entry.pack()

    def on_button(self):
        print(self.entry.get())

app = SampleApp()
app.mainloop()

Exécutez le programme, saisissez le widget d'entrée, puis cliquez sur le bouton.

33
Bryan Oakley

Vous pouvez également utiliser une variable StringVar, même si ce n'est pas strictement nécessaire:

v = StringVar()

e = Entry(master, textvariable=v)
e.pack()

v.set("a default value")
s = v.get()

Pour plus d'informations, consultez cette page sur effbot.org .

8
zortacon

Un exemple simple sans classes:

from tkinter import *    
master = Tk()

# Create this method before you create the entry
def return_entry(en):
    """Gets and prints the content of the entry"""
    content = entry.get()
    print(content)  

Label(master, text="Input: ").grid(row=0, sticky=W)

entry = Entry(master)
entry.grid(row=0, column=1)

# Connect the entry with the return button
entry.bind('<Return>', return_entry) 

mainloop()
3
Marios Theofanidis

*

master = Tk()
entryb1 = StringVar

Label(master, text="Input: ").grid(row=0, sticky=W)

Entry(master, textvariable=entryb1).grid(row=1, column=1)

b1 = Button(master, text="continue", command=print_content)
b1.grid(row=2, column=1)

def print_content():
    global entryb1
    content = entryb1.get()
    print(content)

master.mainloop()

Ce que vous avez fait de mal, c'est de ne pas le mettre dans une fonction Define alors vous n'aviez pas utilisé le .get fonctionne avec la variable de texte que vous avez définie.

2
rodude123