2009-07-09 19 views
23

He visto un par de otras publicaciones en un mensaje de error similar pero no he podido encontrar una solución que lo solucione en mi caso.Tkinter: AttributeError: NoneType objeto no tiene atributo get

Incursioné un poco con TkInter y creé una interfaz de usuario muy simple. El código es el siguiente:

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

Tengo la UI en funcionamiento. Cuando hago clic en el botón Grab, me sale el siguiente error en la consola:

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' 

El error se remonta a Tkinter.py.

Estoy seguro de que alguien podría haber tratado esto antes. Cualquier ayuda es apreciada.

+0

Más detalles [** aquí **] (https://www.begueradj.com/tkinter-saya-idiom.html) –

Respuesta

50

La función grid (y pack, y place) del objeto Entry (y de todos los otros widgets) devuelve None. En Python cuando lo hace a().b(), el resultado de la expresión es lo que b() devuelve, por lo tanto Entry(...).grid(...) devolverá None.

Usted debe dividir en dos líneas que, como este:

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

De esta manera, se obtiene su referencia Entry almacena en entryBox, y está diseñada como usted espera. Esto tiene un efecto secundario extra de facilitar la comprensión y el mantenimiento de su diseño, si recopila todas las declaraciones grid y/o pack en bloques.

3

cambiar esta línea:

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

en estas dos líneas:

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

Lo mismo va para label por cierto - al igual que ya lo hacen correctamente para grabBtn!

+0

Gracias Alex. Debería haber pensado en eso :-) – Arnkrishn

Cuestiones relacionadas