71

我创建了这个简单的 GUI:

from tkinter import *

root = Tk()

def grabText(event):
    print(entryBox.get())    

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

我让 UI 启动并运行。当我单击Grab按钮时,控制台上出现以下错误:

C:\Python> python.exe myFiles\testBed.py
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python\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'

为什么entryBox设置为None

4

4 回答 4

126

对象和所有其他小部件的grid和函数返回。在 python 中,当你这样做时,表达式的结果是返回的结果,因此将返回。packplaceEntryNonea().b()b()Entry(...).grid(...)None

你应该把它分成两行,如下所示:

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

这样,您就可以将Entry参考存储在entryBox其中,并按照您的预期进行布局。grid如果您在块中收集所有和/或pack语句,这具有使您的布局更易于理解和维护的额外副作用。

于 2009-07-09T03:53:34.080 回答
12

更改此行:

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

分为这两行:

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

就像你已经正确地为grabBtn!

于 2009-07-09T05:55:49.843 回答
3

entryBox.get()访问get()方法,您需要Entry对象,但Entry(root, width=60).grid(row=2, column=1, sticky=W)返回 None。

entryBox = Entry(root, width=60)创建一个新的条目对象。

此外,您不需要 ,因为它会用 NoneentryBox = entryBox.grid(row=2, column=1, sticky=W)重写entryBox


只需替换entryBox = entryBox.grid(row=2, column=1, sticky=W)

entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)
于 2020-06-23T23:04:14.880 回答
2

Python3.8+允许使用以下命令将所有这些内容放在一行中的版本的替代解决方案walrus operator

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

现在entryBox将引用Entry小部件并打包。

对于每行管理的字符,我可以这样建议:

(var := Button(
    text='fine', command=some_func, width=20, height=15, activebackground='grey'
)).grid(row=0, column=0, columnspan=0, rowspan=0, sticky='news')

但在这一点上,不妨“正常”地这样做(正如其他答案所建议的那样)

资料来源:

于 2021-08-14T10:06:39.363 回答