Python TKinter奇怪的行为

Python TKinter奇怪的行为,python,python-3.x,tkinter,tkinter-entry,Python,Python 3.x,Tkinter,Tkinter Entry,我有以下Python代码(已安装v3.7): 代码工作正常,并按预期运行,但是,如果我更改以下行: # Add Entries year_entry = tk.Entry() year_entry.grid(column=1, row=1) month_entry = tk.Entry() month_entry.grid(column=1, row=2) day_entry = tk.Entry() day_entry.grid(column=1, row=3) 把它们做成这样的一行: #

我有以下Python代码(已安装v3.7):

代码工作正常,并按预期运行,但是,如果我更改以下行:

# Add Entries
year_entry = tk.Entry()
year_entry.grid(column=1, row=1)
month_entry = tk.Entry()
month_entry.grid(column=1, row=2)
day_entry = tk.Entry()
day_entry.grid(column=1, row=3)
把它们做成这样的一行:

# Add Entries
year_entry = tk.Entry().grid(column=1, row=1)
month_entry = tk.Entry().grid(column=1, row=2)
day_entry = tk.Entry().grid(column=1, row=3)
我得到以下错误:

Tkinter回调回溯中出现异常(最近一次调用最后一次):
文件“Python/lib/tkinter/init.py”,第1705行,在调用中 返回self.func(*args)文件“person\u class.py”,第42行,在 计算年龄 打印(year_entry.get())AttributeError:'NoneType'对象没有属性'get'

这怎么可能?这不应该在一行代码上实现,而不是将条目拆分为不同的行吗

有人能解释一下为什么会发生这种奇怪的行为,以及在Python3.x中声明东西时如何更好地使用一行程序吗


请注意,我是Python的初学者。在Java或Groovy中,一行程序会像预期的那样工作。

因为我认为模糊的tkinter会丢失对对象的引用

试试看

# Add Labels
year_label = tk.Label(master=window, text="Year")
year_label.grid(column=0, row=1)
month_label = tk.Label(master=window, text="Month")
month_label.grid(column=0, row=2)
day_label = tk.Label(master=window, text="Day")
day_label.grid(column=0, row=3)

# Add Entries
  year_entry = tk.Entry()
  year_entry.grid(column=1, row=1)
  month_entry = tk.Entry().grid(column=1, row=2)
  day_entry = tk.Entry().grid(column=1, row=3)

def calculate_age():
    print(type(year_entry))
    print(type(month_entry))
    return
那个回归

对于行中的月\单位条目,类为“NoneType”


“tkinter.Entry”类,用于不属于您的一行代码的年份\条目,与原件不等效。当您的代码执行
year\u entry=tk.entry()
时,您有一个对新
tk.entry
对象的引用。下一行对该对象调用
.grid()
。当您的代码执行
year\u entry=tk.entry().grid(column=1,row=1)
时,它会创建一个新的
tk.entry
对象,调用该对象上的
.grid()
,然后丢弃对
tk.entry
对象的引用,并分配
.grid()
调用的结果(即
None
)对于
year\u entry
@BoarGules,感谢您的直白。你是否有机会知道这种糟糕的设计是否有特别的原因?或者更好的是,你知道我怎样才能强迫它保持引用吗?否则,请将其作为答案提交,以便我可以标记它。请注意,这本身不是tkinter问题。在python中,当您执行
x().y()
时,无论
x()
y()
执行什么操作,python都将返回
y()的结果。在tkinter中,
grid(…)
被定义为返回
None
。在Python中(Python并不是唯一的一个),对一个属性链表达式的赋值,如
a=b.c.d
d
的值赋值给
a
。我不能同意你的看法,那是个拙劣的设计。如果我做了
a=os.path.exists('myfile')
我希望
a
接收一个反映
myfile
存在的布尔值,而不是对模块
os.path
的引用。如果PEP 572将其编入Python3.8,您很快就可以通过这种方式做您想做的事情:
(year\u entry:=tk.entry()).grid(column=1,row=1)
,但我仍然认为您最初的公式比任何一个线性表达式都好。
# Add Labels
year_label = tk.Label(master=window, text="Year")
year_label.grid(column=0, row=1)
month_label = tk.Label(master=window, text="Month")
month_label.grid(column=0, row=2)
day_label = tk.Label(master=window, text="Day")
day_label.grid(column=0, row=3)

# Add Entries
  year_entry = tk.Entry()
  year_entry.grid(column=1, row=1)
  month_entry = tk.Entry().grid(column=1, row=2)
  day_entry = tk.Entry().grid(column=1, row=3)

def calculate_age():
    print(type(year_entry))
    print(type(month_entry))
    return