TypeError:'Text'类型的对象没有len()

时间:2018-04-27 11:32:13

标签: python tkinter

这是什么错误,如何解决?

    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 :(得分:1)

您的代码中的一个问题是使用if语句。您询问文本对象是否具有长度而不是检查文本对象的内容。这可以使用get()来纠正。如果在文本框中使用get(),则需要指定索引。 .get(1.0, "end")。这样做的问题是你得到的长度比输入的长1个字符,所以对此的简单解决方法就是在这里使用输入字段。

使用Entry()字段,您可以使用不带索引的get(),它将获得该字段中文本的副本。请记住,如果您在文本之前或之后有空格,那么它也会计算在内。如果您想对此进行补偿,可以在strip()之后添加get()以删除任意一方的空白区域。

要进行一点清理,您需要更改创建消息的方式。使用您的代码,如果您多次按下按钮,则程序将在每次按下按钮时添加新消息。这将导致消息堆叠。为避免这种情况,我们首先创建消息标签,然后使用.config()方法使用我们的函数更新它。

下一部分清理让我们删除不需要它们的小部件的变量赋值。在这种情况下,您的第一个标签和按钮不需要分配给变量。

清理的最后一点是确保您与小部件保持一致。现在(根据您的示例代码)您将导入tkinter两次。一次使用from tkinter import *,一次使用import tkinter as tk。您不需要两者,只应坚持使用第二种导入方法。使用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()