python has Tkinter: AttributeError: L'objet NoneType n'a aucun attribut




tkinter grid (2)

J'ai vu quelques autres messages sur des messages d'erreur similaires, mais je n'ai pas trouvé de solution pour le corriger dans mon cas.

J'ai essayé un peu avec TkInter et créé une interface utilisateur très simple. Le code suit-

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

Je fais fonctionner l'interface utilisateur. Lorsque je clique sur le bouton Grab , j'obtiens l'erreur suivante sur la 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'

L'erreur revient à Tkinter.py .

Je suis sûr que quelqu'un aurait pu s'en occuper auparavant. Toute aide est appréciée.


Les fonctions grid , pack et place de l'objet Entry et de tous les autres widgets ne renvoient None . En python, lorsque vous faites a().b() , le résultat de l'expression est ce que b() renvoie, donc Entry(...).grid(...) renverra None .

Vous devriez diviser cela en deux lignes comme ceci:

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

De cette façon, vous obtenez votre référence d' Entry stockée dans entryBox et elle est conçue comme vous le souhaitez. Cela a pour effet secondaire de rendre votre mise en page plus facile à comprendre et à gérer si vous collectez tous vos relevés de grid et / ou de pack dans des blocs.


Changer cette ligne:

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

dans ces deux lignes:

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

La même chose vaut pour l' label au passage - comme vous le faites déjà correctement pour grabBtn !







tkinter