Si cela s'exécute dans une interface graphique existante, vous pouvez créer une boîte de dialogue modale avec un Toplevel, en utilisant la méthode wait_window
pour bloquer jusqu'à ce que la fenêtre soit détruite. Si vous souhaitez utiliser une fenêtre contextuelle dans un programme qui ne soit pas non-GUI, vous pouvez créer un petit programme tkinter autonome dans une fonction qui renvoie une valeur lorsque la fenêtre racine est détruite. Dans les deux cas, la technique consiste à attendre que la fenêtre soit détruite, puis à extraire la valeur contenue dans la fenêtre. Puisque la fenêtre aura été détruite, vous devez utiliser un StringVar
car il ne sera pas détruit avec la fenêtre.
Voici un exemple qui suppose aucune interface graphique est déjà en cours d'exécution:
import tkinter as tk
def gui_input(prompt):
root = tk.Tk()
# this will contain the entered string, and will
# still exist after the window is destroyed
var = tk.StringVar()
# create the GUI
label = tk.Label(root, text=prompt)
entry = tk.Entry(root, textvariable=var)
label.pack(side="left", padx=(20, 0), pady=20)
entry.pack(side="right", fill="x", padx=(0, 20), pady=20, expand=True)
# Let the user press the return key to destroy the gui
entry.bind("<Return>", lambda event: root.destroy())
# this will block until the window is destroyed
root.mainloop()
# after the window has been destroyed, we can't access
# the entry widget, but we _can_ access the associated
# variable
value = var.get()
return value
print("Welcome to TCP Socket")
address = gui_input("Insert server address:")
print("Connecting to " + address)
Si vous disposez déjà d'une interface graphique qui est en cours d'exécution, vous pouvez remplacer tk.Tk()
avec tk.Toplevel()
pour créer une fenêtre pop-up, puis utilisez plutôt .wait_window()
que .mainloop()
pour attendre que la fenêtre soit détruite.
Exactement quelle fonctionnalité de 'raw_input' manque dans le widget' tk.Entry' que vous souhaitez émuler? – martineau
@martineau: je suppose que l'OP veut un callable qui bloque jusqu'à ce que l'utilisateur entre une chaîne. –
exactement ce que je veux, si j'utilise get() la fonction continue même si l'entrée est vide. Je veux que la fonction attende la pression de Retour sur le clavier par l'utilisateur – LoreSchaeffer