Использование len с функцией get (), дающей неверную статистику?

У меня есть код, который запрашивает у пользователя ввод 26 символов для создания собственного кода шифрования, и если он имеет длину 26 символов и не является алфавитом или предустановленным кодом encryption_code , код изменяет код encryption_code на все, что они ввели.

 import tkinter from tkinter import * from tkinter import ttk from tkinter.ttk import * encryption_code = 'LFWOAYUISVKMNXPBDCRJTQEGHZ' window = tkinter.Tk() window.title("Encryption/Decryption") change_frame = tkinter.Frame(window) changed_frame = tkinter.Frame(window) encrypt_entry = tkinter.Entry(change_frame) def code_change(): global changed_frame global encrypt_entry print(len(encrypt_entry.get())) if encrypt_entry.get() == 'LFWOAYUISVKMNXPBDCRJTQEGHZ' or 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': encrypt_entry.delete(0, tkinter.END) changed_incorrect.configure(background=window.cget('bg')) changed_incorrect.config(text="Please enter a different code", foreground='red') changed_incorrect.pack() changed_frame.pack() if len(encrypt_entry.get()) == 26: encryption_code = encrypt_entry.get() encrypt_entry.delete(0, tkinter.END) changed_label.configure(background=window.cget('bg')) changed_label.config(text="You have successfully changed the encryption code!") change_header.config(text=str(encryption_code)) changed_incorrect.pack_forget() changed_label.pack() changed_frame.pack() elif len(encrypt_entry.get()) < 26 or len(encrypt_entry.get()) > 26: changed_incorrect.configure(background=window.cget('bg')) changed_incorrect.config(text="Please enter only 26 characters", foreground='red') changed_label.pack_forget() changed_incorrect.pack() changed_frame.pack() change_label = tkinter.Label(change_frame, text="Please enter your own encryption code in block capitals", font=('Helvetica', 12)) change_header = tkinter.Label(change_frame, text="Make sure it is all 26 letters and do not repeat a letter to prevent errors", font=('Helvetica', 12)) change_confirm = ttk.Button(change_frame, text="Confirm", width=20, command=code_change) changed_label = tkinter.Label(changed_frame, text="You have successfully changed the encryption code!", font=('Helvetica', 14)) changed_incorrect = tkinter.Label(changed_frame, text="Please enter your code again", font=('Helvetica', 14)) change_label.pack() change_header.pack() encrypt_entry.pack() change_confirm.pack() change_frame.pack() window.mainloop() 

Моя проблема заключается в том, что когда я пытаюсь ввести 26 символов, например QWERTYUIOPASDFGHJKLZXCVBNM, это говорит мне, что я не ввел 26 символов, когда он явно имеет 26 символов, и сообщение предназначено только для всплытия, если пользователь не ввел 26 символов.

UPDATE: использование print (len (encrypt_entry.get ())) показало мне, что моя запись – 26, но мой код говорит, что это не 26 символов.

2 Solutions collect form web for “Использование len с функцией get (), дающей неверную статистику?”

Проблема заключается в первом утверждении if

 if encrypt_entry.get() == 'LFWOAYUISVKMNXPBDCRJTQEGHZ' or 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': 

Это всегда True , так как группировка булевых выражений делает это –

 if (encrypt_entry.get() == 'LFWOAYUISVKMNXPBDCRJTQEGHZ') or ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'): 

И все непустые строки имеют значение True в булевом контексте. Это заставляет программу удалять все, что находится в записи, и, следовательно, вы получаете ошибку от второго, if условие. Вы можете вместо этого сделать –

 encryptgetted = encrypt_entry.get() if encryptgetted == 'LFWOAYUISVKMNXPBDCRJTQEGHZ' or encryptgetted == 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': 

У вас есть пара проблем. Во-первых, это утверждение:

 if encrypt_entry.get() == 'LFWOAYUISVKMNXPBDCRJTQEGHZ' or 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': 

Когда вы используете выражение типа if x == "a" or "b" , оно будет таким же, как если бы вы выполняли if (x == "a") or ("b") , что является таким же, как if (x == "a") or ("b" != "") .

Поскольку второе условие всегда будет истинным в вашем коде, если поле ввода не пустое, все это условие всегда будет истинным. Таким образом, этот блок кода выполняется для всего, кроме случая, когда поле ввода пуст.

Вторая проблема заключается в том, что внутри этого первого «if» вы удаляете все в виджетах ввода. Поскольку каждый блок «if» повторно извлекает содержимое, все следующие операторы «if» будут получать пустую строку.

Правильный способ закодировать это – получить значение ровно один раз в начале вашей программы, а затем правильно использовать другое, чтобы вы проходили только один блок кода:

 user_input = encrypt_entry.get() if (user_input == 'LFWOAYUISVKMNXPBDCRJTQEGHZ' or user_input == 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'): ... elif (len(user_input) == 26): ... else ... 
  • Получение меток tkinter для обновления при изменении переменных
  • Есть ли известная ошибка Win32 Tkinter в отношении отображения фотографий на холсте?
  • Tkinter: Привязать ключ для выбора следующего окна и прокрутки списка этого окна
  • Python, Tkinter - Вставка текста в окна холста
  • Python 3.2 tkinter создает рамку результатов для вывода вывода
  • Как получить входной сигнал от виджета текстового окна Tkinter?
  • python: tkinter для отображения видео с веб-камеры и сканирования QR-кода
  • как решить AttributeError в python и tkinter?
  • измерять прогресс (время осталось), в то время как os.listdir генерирует список (Python)
  • задайте текст записи с помощью кнопки tkinter
  • _tkinter.TclError: не удается найти пакет Tktable
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.