2009-07-09 38 views
23

Tôi đã thấy một vài bài đăng khác có thông báo lỗi tương tự nhưng không thể tìm thấy giải pháp khắc phục sự cố trong trường hợp của tôi.Tkinter: AttributeError: đối tượng NoneType không có thuộc tính nào nhận được

Tôi đã thử một chút với TkInter và tạo một giao diện người dùng rất đơn giản. Mã sau-

from string import * 
from Tkinter import * 
import tkMessageBox 

root=Tk() 
vid = IntVar() 

def grabText(event): 
    if entryBox.get().strip()=="": 
     tkMessageBox.showerror("Error", "Please enter text") 
    else: 
     print entryBox.get().strip()  

root.title("My Sample") 
root.maxsize(width=550, height=200) 
root.minsize(width=550, height=200) 
root.resizable(width=NO, height=NO)  

label=Label(root, text = "Enter text:").grid(row=2,column=0,sticky=W) 
entryBox=Entry(root,width=60).grid(row=2, column=1,sticky=W) 
grabBtn=Button(root, text="Grab") 
grabBtn.grid(row=8, column=1) 
grabBtn.bind('<Button-1>', grabText) 

root.mainloop() 

Tôi có giao diện người dùng và chạy. Khi tôi bấm vào nút Grab, tôi nhận được lỗi sau trên console:

C:\Python25>python.exe myFiles\testBed.py 
Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__ 
    return self.func(*args) 
    File "myFiles\testBed.py", line 10, in grabText 
    if entryBox.get().strip()=="": 
AttributeError: 'NoneType' object has no attribute 'get' 

Các lỗi dấu vết trở lại Tkinter.py.

Tôi chắc chắn một số người có thể đã xử lý vấn đề này trước đây. Bất kỳ trợ giúp được đánh giá cao.

+0

Chi tiết khác [** tại đây **] (https://www.begueradj.com/tkinter-saya-idiom.html) –

Trả lời

50

Các grid (và pack, và place) chức năng của đối tượng Entry (và của tất cả các vật dụng khác) trả None. Trong trăn khi bạn thực hiện a().b(), kết quả của biểu thức là bất kỳ số nào trả về b(), do đó Entry(...).grid(...) sẽ trả lại None.

Bạn nên chia đó vào hai dòng, như thế này:

entryBox = Entry(root, width=60) 
entryBox.grid(row=2, column=1, sticky=W) 

Bằng cách đó, bạn sẽ có được Entry tài liệu tham khảo của bạn lưu trữ trong entryBox, và nó đặt ra như bạn mong đợi. Điều này có tác dụng phụ của việc làm cho bố cục của bạn dễ hiểu và dễ bảo trì hơn, nếu bạn thu thập tất cả các câu lệnh grid và/hoặc pack của bạn trong các khối.

3

Thay đổi dòng này:

entryBox=Entry(root,width=60).grid(row=2, column=1,sticky=W) 

vào hai dòng sau:

entryBox=Entry(root,width=60) 
entryBox.grid(row=2, column=1,sticky=W) 

Cũng vậy với label bằng cách này - cũng giống như bạn đã làm một cách chính xác cho grabBtn!

+0

Cảm ơn Alex. Tôi cần phải có suy nghĩ về điều đó :-) – Arnkrishn

Các vấn đề liên quan