2015-10-23 4 views
0

J'ai un code qui demande à l'utilisateur d'entrer un mot qu'il souhaite chiffrer, puis le programme crypte le mot et l'affiche sur une étiquette. Je me demandais pourquoi le code suivant fonctionne:La fonction entry.get() ne changera pas la valeur d'une variable

import tkinter 

letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

encryption_code = 'LFWOAYUISVKMNXPBDCRJTQEGHZ' 
letters += letters.lower() 
encryption_code += encryption_code.lower() 

window = tkinter.Tk() 
encryption_code_entry = tkinter.Entry(window) 
entry = tkinter.Entry(window) 

enc = dict(zip(letters,encryption_code)) 

string = 'hello world' 

encr = "".join([enc.get(ch, ch) for ch in string]) 

def encrypt():  
    encrypt_label.pack() 
    entry.pack() 
    encrypt_confirm.pack() 
    encrypt_button.destroy() 

def display_encrypt(): 
    display_enc = encr 
    encrypted_label.pack() 
    new_message.config(text=str(display_enc)) 
    new_message.pack() 

encrypt_confirm = tkinter.Button(window, text="Confirm", command=display_encrypt) 
new_message = tkinter.Label(window, text="", font=('Helvetica', 10)) 
encrypted_label = tkinter.Label(window, text="Your message " + entry.get() + " has been encrypted into the following: ") 
encrypt_button = tkinter.Button(window, text="Encrypt", command=encrypt) 
encrypt_button.pack() 
encrypt_label = tkinter.Label(window, text="Please enter the message you'd like to encrypt", font=('Helvetica', 14)) 

window.mainloop() 

Mais si je change string = 'hello world' (ce qui est ce que je voudrais faire) à string = entry.get() rien ne s'affiche on new_message`. En outre,

encrypted_label = tkinter.Label(window, text="Your message " + entry.get() + "has been encrypted into the following: ") 

n'affiche pas ce que l'utilisateur a tapé dans la zone d'entrée, donc je suis presque 100% sûr que je suis abusant de la fonction entry.get().

Répondre

2

En fait, vous devez avoir le entry.get() sous display_encrypt().

Chaque fois que le bouton encrypt_confirm est pressé, il appelle display_encrypt qui pourra à son tour obtenir la chaîne en cours à entry à chaque pression de l'utilisateur.

J'ai modifié un peu votre code et cela semble fonctionner.

Notez que j'ai supprimé string et encr car ils étaient maintenant des variables redondantes.

import tkinter 

letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

encryption_code = 'LFWOAYUISVKMNXPBDCRJTQEGHZ' 
letters += letters.lower() 
encryption_code += encryption_code.lower() 

window = tkinter.Tk() 
encryption_code_entry = tkinter.Entry(window) 
entry = tkinter.Entry(window) 

enc = dict(zip(letters,encryption_code)) 

string = 'hello world' 

def encrypt():  
    encrypt_label.pack() 
    entry.pack() 
    encrypt_confirm.pack() 
    encrypt_button.destroy() 

def display_encrypt(): 
    display_enc = "".join([enc.get(ch, ch) for ch in entry.get()]) 
    encrypted_label.pack() 
    new_message.config(text=str(display_enc)) 
    new_message.pack() 

encrypt_confirm = tkinter.Button(window, text="Confirm", command=display_encrypt) 
new_message = tkinter.Label(window, text="", font=('Helvetica', 10)) 
encrypted_label = tkinter.Label(window, text="Your message " + entry.get() + " has been encrypted into the following: ") 
encrypt_button = tkinter.Button(window, text="Encrypt", command=encrypt) 
encrypt_button.pack() 
encrypt_label = tkinter.Label(window, text="Please enter the message you'd like to encrypt", font=('Helvetica', 14)) 

window.mainloop() 
0

Vous appelez entry.get() bien avant que l'utilisateur n'ait une chance d'entrer quoi que ce soit. Vous devez appeler et remettre l'étiquette en réponse à un événement, comme l'utilisateur en appuyant sur <Retour>, en cliquant sur un bouton, etc.

+0

Est-ce que ça marcherait si je mettais juste 'entry.get()' sous le 'def display_encrypt()'? – Inkblot