Использование 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 в отдельном потоке
  • Как получить текст метки Tkinter?
  • Как установить положение мыши в окне tkinter
  • Python / ttk / tKinter - передача аргумента нажатием кнопки func?
  • Почему Photoimage работает медленно?
  • Как я могу получить рамку с полосой прокрутки в Tkinter?
  • Как получить холст tkinter для динамического изменения размера окна?
  • ttk.Combobox сбой, когда состояние доступно только для чтения и не в фокусе
  •  
    Interesting Posts for Van-Lav

    Как найти пересечение двух линий с учетом точки на каждой прямой и параллельного вектора

    Расширение флеш-сессии и сеанс по умолчанию

    Django @override_settings не позволяет использовать словарь?

    Вставка объекта datetime.datetime Python в MySQL

    Как разобрать отступы и разделители с помощью pyparsing?

    Проблема управления процессом

    Идиоматический питон – свойство или метод?

    Python, OpenCV – выравнивание и наложение нескольких изображений один за другим

    PIPON PIP имеет проблемы с путём для MS Visual Studio 2010 Express для 64-разрядной установки на Windows 7

    Numpy.Array в списке Python?

    В чем разница между префиксом u и префиксом unicode () в python?

    Tkinter: установите StringVar после события <Key>, включая нажатую клавишу

    Парамико: перенаправление портов вокруг NAT-маршрутизатора

    mysql error: ERROR 1018 (HY000): Не удается прочитать директорию '.' (errno: 13)

    Форматы django MultipleChoiceField возвращается к исходному значению при сохранении

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