Tkinter 为什么在另一行中使用pack()方法?
我有一个关于为什么要在另一行中使用Tkinter 为什么在另一行中使用pack()方法?,tkinter,python,python-3.x,function,methods,Tkinter,Python,Python 3.x,Function,Methods,我有一个关于为什么要在另一行中使用.pack()的快速问题 例如: 如果我按如下方式调用标签函数: import tkinter as tk root = tk.Tk() label = tk.Label(root, text="Sample Text").pack() 它在以下情况下具有相同的效果: 但是,当我稍后要配置标签时,第一个示例不起作用: label = tk.Label(root, text="Sample Text").pack() label.config(bg="YELL
.pack()
的快速问题
例如:
如果我按如下方式调用标签
函数:
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Sample Text").pack()
它在以下情况下具有相同的效果:
但是,当我稍后要配置标签时,第一个示例不起作用:
label = tk.Label(root, text="Sample Text").pack()
label.config(bg="YELLOW")
提出一项建议:
AttributeError: 'NoneType' object has no attribute 'config'
当我在单独一行中编写pack()
函数时,这个问题就得到了解决:
label = tk.Label(root, text="Sample Text")
label.pack()
label.config(bg="YELLOW")
为什么这样做?这与返回值有关。如果要链接语句,那么返回值将是链中最后一个方法返回的值<代码>标签()返回标签对象
pack()
返回None
。现在您可以想象错误“NoneType对象没有属性“X”实际上意味着什么
因此,解决方案是使用Label()
并将对象保存到变量中。然后,对对象调用方法pack()
pack()
仍然返回None
,但是标签
变量不会被None
覆盖。它仍然包含标签对象
编辑:我想我应该详细说明一下
python中的所有函数都返回一个值,即使这不是显式的。当你写一个函数,比如
def return_something():
return "some value"
return_value = return_something()
然后return\u value
变量将引用带有文本“some value”的字符串
考虑一个函数,它不会返回类似的结果
def return_nothing():
print "No values returned in this function"
returned_value = return_nothing()
return\u nothing()
的返回值为None
,这是将分配给returned\u value
的值。如果你以前有什么东西在里面,它就会不见了
当像您在Label().pack()
示例中那样进行方法链接时,您实际上是在Label()
返回的对象上调用方法pack()
。链的最终返回值将是最后一个方法返回的值pack()
不返回任何内容,因此返回值为None
,这就是分配给变量标签的内容。但是,如果以Label()
结束链,则返回值是一个Label对象,这就是Label
中的内容。在单独一行上调用pack()
时,将放弃返回值None
(它不会覆盖label
中的label对象)
希望这更清楚一点:)因为:
所有方法都会返回一些东西,无论是None
还是其他方法
特定对象
call1().call2().call3()…calln()
返回任何calln()
应该回来的
赋值的左侧(lh=rh
)被赋值
rh
中的表达式(如果有)返回
grid
、pack
、place
都是小部件上返回None
的方法(当缺少实际的返回
语句时的默认返回值)
这里有一个非常相似的行为:
def return_a_list():
return [0, 1]
rh = return_a_list().append(3)
lh = rh
input(lh)
真的帮了我很多忙。谢谢你,伙计
def return_a_list():
return [0, 1]
rh = return_a_list().append(3)
lh = rh
input(lh)