0
votes

Comment mettre à jour une variable en saisissant du texte à partir d'une zone de texte dans tkinter à l'aide de la touche Entrée?

J'utilise Tkinter et j'essaie de créer un programme de discussion. Je dois qu'il puisse ouvrir une nouvelle fenêtre qui vous invite à entrer dans l'adresse IP de l'utilisateur que vous souhaitez vous connecter. Lorsque vous appuyez sur Entrée, il est censé mettre à jour une variable à cette adresse IP pour une utilisation ultérieure. Le problème est que la variable n'est pas mise à jour, mais elle maintient sa valeur initiale. J'utilise la fonction () code> pour saisir du texte dans la zone de texte. Lorsque j'imprime la fonction .get () code> fonctionne fonctionne mais réglage de la variable utilisant .get () code> ne fonctionne pas. Envoyer est toujours l'impression 1. Des idées?

other_address = 1

def join():
    newWindow = Toplevel(master) 

newWindow.title("IP") 

newWindow.geometry("300x50") 

directions = Label(newWindow, text="Enter the IP Address of the user you would like to join")
directions.pack()

enter_hostname = Entry(newWindow)
enter_hostname.pack()
newWindow.bind("<Return>", lambda x: other_address == enter_hostname.get())
newWindow.bind("<Return>", lambda x: print(enter_hostname.get()))

def send():
    print (other_address)


0 commentaires

3 Réponses :


0
votes

Depuis que vous liez Newwindow deux fois, la première liaison est écrasée, vous en avez besoin comme suit:

def change(event):
    other_address == enter_hostname.get()
def get_it(event):
    print(enter_hostname.get())


newWindow.bind("<Return>", change, add='+')
newWindow.bind("<Return>", get_it, add='+')


4 commentaires

J'ai eu ceci: fichier "gui.py", ligne 37 newwindow.bind ("<< retour>", Evénement Lambda: [autre_address = Enter_hostname.get (), Imprimer (Enter_hostname.get ())] ^ SyntaxError: Syntaxe invalide


Les points de carotte sur le formatage des panneaux sont juste sur


Au lieu de créer une Lambda compliquée, il serait beaucoup mieux de créer une fonction traditionnelle. Les Lambdas sont difficiles à comprendre et encore plus difficiles à déboguer.


@Bryanoakley Vous avez raison. Le rappellera pour l'avenir.



0
votes

Un opérateur double équivalent == ne crée pas une variable en Python, c'est ce qu'on appelle ce qu'on appelle un opérateur d'égalité, il vérifie donc qu'ils sont égaux et renvoie vrai ou faux. Pour définir une variable dans Python, vous devez plutôt utiliser un seul égal, = de sorte que la ligne devienne: newwindow.bind ("", lambda x: autre_address = Enter_hostname.get ())


2 commentaires

Je continue à obtenir ceci: SyntaxError: expression ne peut pas contenir d'affectation, peut-être que vous vouliez dire "=="?


@ Whearn17 Le problème ici est qu'une expression de Lambda n'est pas autorisée à détenir une affectation car elle devrait être une ligne et est sa propre "portée" afin que toute affectation variable qu'elle faffle ne signifie rien. Si vous allez seulement faire cela une fois que vous pourriez envisager de définir le paramètre autre_address sur 0 au début, puis effectuez autre_address + = Enter_hostname.get () dans la fonction Lambda, si Cela s'appellera plusieurs fois à une seule fois, voir ma prochaine réponse pour une solution plus complète



1
votes

Ceci est une réponse à la syntaxError donnée dans les commentaires: Le problème ici est qu'une expression de Lambda crée une "portée" qui signifie que lorsqu'il finit toutes les variables, elles ont été créées sont automatiquement détruites. La solution à ceci est de créer une fonction appropriée qui obtient autre_address dans sa portée globale afin qu'elle puisse la modifier correctement comme: xxx

puis la liaison peut être : xxx

où vous venez de passer la fonction SET_Address au lieu d'une expression Lambda


2 commentaires

Ok le seul problème que j'açais avec c'est une NameError. Il dit ENTER_HOSTNAME n'est pas défini. Y a-t-il quelque chose que je puisse faire ce global quand je le définis?


@ Whearn17 Parce que vous exécutez une opération sur Enter_HostName plutôt que de l'affecter, il n'a pas besoin d'être global. Le problème est que vous initiez à l'initialisation de la fonction avant la variable Enter_hostname, vous devez donc placer cette définition de fonction entre le Entrer_hostname.pack () et Newwindow ... Lignes à la place de plus en plus