为什么使用 Tkinter 时会出现“AttributeError: NoneType 对象没有属性”? None 值从何而来?

2024-11-15 08:36:00
admin
原创
185
摘要:问题描述:我创建了这个简单的 GUI:from tkinter import * root = Tk() def grabText(event): print(entryBox.get()) entryBox = Entry(root, width=60).grid(row=2, col...

问题描述:

我创建了这个简单的 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()

当我单击Grab按钮时,出现错误:

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

为何entryBox设置为None


另请参阅为什么我会得到 AttributeError: 'NoneType' 对象没有属性 'something'?以了解一般情况。


解决方案 1:

对象和所有其他小部件的gridpackplace函数返回。在 Python 中,当您执行 时,表达式的结果就是返回的任何内容,因此将返回。Entry`Nonea().b()b()Entry(...).grid(...)None`

您应该将其分成两行,如下所示:

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

这样,您便可以Entry存储引用entryBox,并且其布局与预期一致。如果您将所有gridand/orpack语句都收集到块中,则这样做还有一个额外的副作用,那就是使布局更易于理解和维护。

解决方案 2:

更改此行:

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

解决方案 3:

版本的替代解决方案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')

但在那时不妨只是“正常”地这样做(正如其他答案所建议的那样)

资料来源:

  • PEP 572——赋值表达式

  • 在我看来很棒的视频解释walrus operator

解决方案 4:

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

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

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


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

entryBox = Entry(root, width=60)
entryBox.grid(row=2, column=1, sticky=W)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1247  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用,助力企业提升产品开发效率、降低成本、增强市场竞争力。深入理解其核心要素,对于企业成功实施 IPD 研发管理体系至关重要。以下将对 IPD 研发管理体系的四大核心要素进行详细解析。...
IPD流程中的charter   19  
  IPD(Integrated Product Development)研发管理体系强调将产品开发视为一个完整的流程,从市场需求出发,整合企业的各种资源,实现产品的快速、高质量交付。在这个过程中,成本控制是至关重要的一环,它直接关系到产品的竞争力和企业的盈利能力。有效的成本控制能够确保在不牺牲产品质量和性能的前提下,降低...
IPD开发流程管理   22  
  IPD(Integrated Product Development)项目管理作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它通过整合跨部门团队,实现从概念到产品上市的全流程高效管理,提升产品竞争力。深入探讨IPD项目管理的六个关键阶段,对于企业理解和运用这一模式,优化产品开发流程具有重要意义。概念阶段概...
IPD概念阶段   29  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品开发的高效、协同与创新。在这一流程管理体系下,产品质量保障成为企业关注的核心要点之一。有效的产品质量保障策略不仅能够提升产品的市场竞争力,还能为企业赢得良好的声誉和客户忠诚度。接下...
华为IPD   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用