Использование 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 ... 
  • Python 2.7.2 глобальные переменные + tkinter
  • Проблемы, связанные с перехватом подпроцесса в режиме реального времени
  • Tkinter Label не показывает изображение
  • Как передать аргумент обработчику событий в tkinter?
  • Python Tkinter: прокрутка холста с помощью MouseWheel
  • Ошибка в минимальном примере tkSimpleDialog
  • Python 2.7.9 Mac OS 10.10.3 Сообщение «setCanCycle: устарело. Вместо этого используйте setCollectionBehavior вместо "
  • Python re "ложная ошибка выхода"
  • Интерфейс GUI Cookbook для сценария командной строки
  • Входной виджет Tkinter с Overrideredirect и полноэкранным
  • Интеграция скриптов iMacros в python
  •  
    Interesting Posts for Van-Lav

    В чем преимущество использования выражения «with .. as» в Python?

    Потоки двухстрочных графиков с использованием боке

    Когда я запускаю setuptools .egg «как если бы это был сценарий оболочки», что на самом деле происходит?

    Изменение определенных значений в нескольких столбцах панда DataFrame сразу

    Отображать массив NumPy как постоянное обновление изображения с помощью Glumpy

    Элегантный способ избежать .put () на неизмененных объектах

    От даты до полезного значения Python

    Python3 + Curses: Как нажимать «q» для окончательной программы сразу?

    Правильное использование функции fold или reduce для длинных данных в python или javascript?

    SWIG не может преобразовать тип typedef

    Работа с несколькими доменами в Flask

    Печать логических значений True / False с помощью метода format () в Python

    Добавление фильтра по умолчанию в древовидном представлении – пользовательский модуль OpenErp

    Отпечатать строку на консоли в Python?

    Что такое питоновский способ одновременного перебора двух массивов?

    Python - лучший язык программирования в мире.