Ошибка типа: объект типа «Текст» не имеет len () - PullRequest
0 голосов
/ 27 апреля 2018

что это за ошибка и как ее исправить?

    def check_number():
    if (len(txtNum1)!=11):
        error_number = "the number that you entered is wrong"
        msg = tk.Message(frame, text = error_number , fg="red")
        msg.pack()

title = Label(frame, text="enter your number", fg="gray")
title.pack()

txtNum1 = Text (frame, height=1, width=30)
txtNum1.pack(side=tk.TOP)

button = tk.Button(frame, 
                   text="chek", 
                   fg="green",
                   command=check_number)
button.pack(side=tk.BOTTOM)

root.mainloop()

Я только что протестировал __len__ метод, но он не работает.

1 Ответ

0 голосов
/ 27 апреля 2018

Одной из проблем в вашем коде является использование оператора if. Вы спрашиваете, имеет ли текстовый объект длину, вместо проверки содержимого текстового объекта. Это можно исправить с помощью get(). Если вы используете get() в текстовом поле, вам нужно будет указать индексы. .get(1.0, "end"). Проблема, связанная с этим, заключается в том, что вы получите длину, которая на 1 символ длиннее, чем было введено, поэтому простое решение - просто использовать здесь поле ввода.

С полем Entry() вы можете использовать get() без индексов, и он получит копию текста в этом поле. Имейте в виду, если у вас есть пробел до или после текста, он также будет учитываться. Если вы хотите компенсировать это, вы можете добавить strip() после get(), чтобы удалить пробелы с обеих сторон.

Для небольшой очистки вы захотите изменить способ создания сообщения. С вашим кодом, если вы нажмете кнопку несколько раз, программа будет добавлять новое сообщение при каждом нажатии кнопки. Это приведет к тому, что сообщения будут складываться. Чтобы избежать этого, сначала создайте метку сообщения, а затем просто обновите ее с помощью нашей функции, используя метод .config().

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

Последнее, что нужно сделать, это убедиться, что вы соответствуете своим виджетам. Прямо сейчас (на основе вашего примера кода) вы импортируете tkinter дважды. Один раз с from tkinter import * и один раз с import tkinter as tk. Вам не нужны оба, и вы должны придерживаться только 2-го метода импорта. Использование import tkinter as tk поможет предотвратить переопределение встроенных методов при аварии.

Посмотрите на мой код:

import tkinter as tk

root = tk.Tk()

def check_number():
    msg.config(text = "")
    if len(txtNum1.get().strip()) != 11:
        error_number = "the number that you entered is wrong"
        msg.config(text = error_number)

tk.Label(root, text="enter your number", fg="gray").pack()

txtNum1 = tk.Entry(root, width=30)
txtNum1.pack(side=tk.TOP)

tk.Button(root, text="chek", fg="green", command=check_number).pack(side=tk.BOTTOM)

msg = tk.Message(root, text = "" , fg="red")
msg.pack()

root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...