2016-08-02 2 views
0

J'essaie de créer une interface graphique pour un socket TCP, la fonction principale demande l'adresse du serveur et attend une réponse pour continuer. Voici le codeComment utiliser Tkinter Entry comme raw_input

print("Welcome to TCP Socket") 
address = raw_input("Insert server address: ") 
print("Connectiong to " + address) 
... 

Maintenant, j'ai une entrée de Tkinter iTxt appelée à recueillir les commentaires des utilisateurs et j'utiliser la méthode get() pour obtenir l'entrée, mais le résultat est le même que raw_input() et je peux ne pas comprendre comment émuler raw_input. Est-ce que quelqu'un peut m'aider?
Merci

+0

Exactement quelle fonctionnalité de 'raw_input' manque dans le widget' tk.Entry' que vous souhaitez émuler? – martineau

+0

@martineau: je suppose que l'OP veut un callable qui bloque jusqu'à ce que l'utilisateur entre une chaîne. –

+0

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

Répondre

-1

Vous ne pouvez pas émuler complètement raw_input dans tkInter, car tkInter est piloté par les événements. Lorsque vous utilisez raw_input, l'exécution du programme se bloque jusqu'à ce que vous fournissiez des données et que vous appuyiez sur Entrée. Lorsque vous utilisez get(), vous aurez toujours des entrées, même si votre entrée est vide.

La manière la plus simple d'obtenir un comportement de blocage consiste à utiliser une boîte de dialogue modale. Mais la meilleure façon d'y aller est de plonger dans la programmation événementielle. Si quelque chose est entré (et probablement OK), un événement est déclenché par TkInter. En réaction à cet événement, vous appelez une fonction de gestionnaire d'événements traitant l'entrée.

Tous les GUI utilisent la programmation événementielle, il est donc rentable d'investir (assez) de temps.

+1

Je pense _ "Vous ne pouvez pas émuler complètement raw_input dans tkInter, puisque tkInter est piloté par les événements" _ est faux. Vous pouvez absolument créer une interface graphique qui attendra la saisie. Dans cette réponse, vous mentionnez les dialogues modaux, ce qui rend votre réponse très confuse. D'abord vous dites que vous ne pouvez pas, alors vous dites que vous pouvez. –

+0

ok, j'ai eu le point – LoreSchaeffer

2

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.

+0

cela pourrait être une possibilité valide, mais ce serait trop obsolète parce que ce programme a besoin d'une entrée de l'utilisateur pour obtenir une réponse comme dans un shell – LoreSchaeffer

+0

@LoreSchaeffer: Je ne comprends pas votre commentaire. Lorsque vous appelez cette fonction, une fenêtre apparaît et attend qu'un utilisateur entre des données. N'est-ce pas exactement ce que tu veux? –

+0

Je ne peux pas ouvrir une popup evry temps je dois ajouter une commande – LoreSchaeffer