AttributeError: 条目实例没有属性“__len__" [英] AttributeError: Entry instance has no attribute '__len__'

查看:21
本文介绍了AttributeError: 条目实例没有属性“__len__"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 python 很陌生,我一直在玩 Tkinter 和 requests 尝试创建一个可以登录到我的 Web 应用程序的简单程序.我一直收到以下错误:

I am quite new to python, I have been playing around with Tkinter and requests to try to create a simple program that can log into my web application. I have been getting the following error:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "test.py", line 35, in login
    c.post('http://fruro.com/login.php', data=self.payload)
  File "/Users/Peter/Desktop/fruroPy/fruro/lib/python2.7/site-packages/requests/sessions.py", line 399, in post
    return self.request('POST', url, data=data, **kwargs)
  File "/Users/Peter/Desktop/fruroPy/fruro/lib/python2.7/site-packages/requests/sessions.py", line 343, in request
    prep = req.prepare()
  File "/Users/Peter/Desktop/fruroPy/fruro/lib/python2.7/site-packages/requests/models.py", line 222, in prepare
    p.prepare_body(self.data, self.files)
  File "/Users/Peter/Desktop/fruroPy/fruro/lib/python2.7/site-packages/requests/models.py", line 375, in prepare_body
    body = self._encode_params(data)
  File "/Users/Peter/Desktop/fruroPy/fruro/lib/python2.7/site-packages/requests/models.py", line 81, in _encode_params
    return urlencode(result, doseq=True)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib.py", line 1311, in urlencode
    len(v)
AttributeError: Entry instance has no attribute '__len__'

几个小时以来,我一直试图找出可能出了什么问题,但我就是不知道自己做错了什么.

I have been trying to figure out what could have gone wrong for several hours but I just don't know what I'm doing wrong.

这是我正在使用的代码:

Here is my code that I'm using:

from Tkinter import *
from requests import session

class Login:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.emLabel = Label(frame, text="Email:")
        self.emLabel.pack(side=LEFT)

        self.email = Entry(frame, width=15)
        self.email.pack(side=LEFT)

        self.pasLabel = Label(frame, text="Password:")
        self.pasLabel.pack(side=LEFT)

        self.password = Entry(frame, show="*", width=15)
        self.password.pack(side=LEFT)

        self.hi_there = Button(frame, text="Login", command=self.login)
        self.hi_there.pack()

    def login(self):

        self.payload = {
            'action': 'login',
            'email': self.email,
            'password': self.password 
        }

        with session() as c:
            c.post('http://fruro.com/login.php', data=self.payload)
            self.request = c.get('http://fruro.com')
            print self.request.headers
            print self.request.text


root = Tk()
login = Login(root)
root.title("Login to your account")
root.mainloop()

任何帮助将不胜感激.提前致谢.

Any help would be appreciated. Thank you in advance.

推荐答案

问题就在这一行,

c.post('http://fruro.com/login.php', data=self.payload)

发生这种情况是因为您作为 data 参数传入的 dict 具有引用 Entry 小部件而不是内容的值那些小部件.因此,当 Requests 尝试获取 len 时,您会收到一个错误,因为 Entry 没有实现 __len__(不是反正你想要什么).要修复它,请将 self.payload 更改为类似,

And it is happening because the dict you are passing in as data parameter has values that are references to Entry widgets and not the content of those widgets. So when Requests tries to get the len, you get an error since Entry doesn't implement __len__ (not what you wanted anyway). To fix it change self.payload to something like,

self.payload = {
        'action': 'login',
        'email': self.email.get(),      # call get method to return
        'password': self.password.get() # the value in the Entry widgets
    }

这篇关于AttributeError: 条目实例没有属性“__len__"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆