2013-05-05 12 views
2

저는 파이썬에 대해 아주 익숙합니다. 저는 Tkinter와 requests을 가지고 놀고 있었고 제 웹 응용 프로그램에 로그인 할 수있는 간단한 프로그램을 만들려고했습니다. 나는 몇 시간 동안 잘못 갈 수 있지만, 난 그냥 내가 잘못 뭘하는지 모르는 것을 알아 내기 위해 노력 해왔다AttributeError : 입력 인스턴스에 '__len__'속성이 없습니다.

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__' 

: 나는 다음과 같은 오류를 받고있다. 어떤 도움을 주시면 감사하겠습니다

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() 

:

여기 내가 사용 내 코드입니다. 미리 감사드립니다.

답변

2

문제는이 라인에

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

입니다 그리고 dict 당신이 data 매개 변수로 전달하는 것은 Entry 위젯에 대한 참조가 아니라 그 위젯의 내용에있는 값을 가지고 있기 때문에이 일어나고있다. 따라서 Requestslen을 얻으려고하면 Entry__len__을 구현하지 않으므로 오류가 발생합니다 (어쨌든 원하는 것은 아닙니다). 수정하려면 self.payload

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

+1과 같이 변경하십시오. 이 답변이 좋을 때 나는 대답을 제거 할 것입니다. – Elazar

+0

대단히 고맙습니다. 문제가 해결되었습니다. –

관련 문제