我有一个简单的问题,为什么我应该在另一行使用.pack()
。
示例:如果我按如下方式调用Label
函数:
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Sample Text").pack()
它在tkinter具有相同的效果:
label = tk.Label(root, text="Sample Text")
label.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")
为什么python表现得那样?
因为:
None
还是其他特定对象。call1().call2().call3()....calln()
返回任何calln()
应该返回的东西。lh = rh
)被赋值为rh
返回的任何表达式(如果有的话)。grid
,pack
,place
都是返回tkinter的None
小部件的方法(缺少实际的return
语句时的默认返回值)。
这是一个非常相似的行为:
def return_a_list():
return [0, 1]
rh = return_a_list().append(3)
lh = rh
input(lh)
这与返回值有关。如果你是链接语句,那么你的返回值将是链中最后一个方法返回的值。 Label()
返回一个标签对象。 pack()
返回None
。你现在可以想象错误“NoneType对象没有属性'X'”实际意味着什么。
因此,解决方案是,使用Label()
并将对象保存到变量。然后,在对象上调用方法pack()
。 pack()
仍然返回None
,但label
变量不会被None
覆盖。它仍然包含标签对象。
编辑:我想我会详细说明一下。
python中的所有函数都返回一个值,即使这没有明确地完成。当你写一个像这样的函数
def return_something():
return "some value"
return_value = return_something()
那么return_value
变量将引用一个文本为“some value”的字符串。
考虑一个不返回任何东西的函数
def return_nothing():
print "No values returned in this function"
returned_value = return_nothing()
return_nothing()
将具有None
的返回值,这是将分配给returned_value
的值。如果你以前有过任何东西,它就会消失。
当像你在Label().pack()
示例中那样进行方法链接时,你实际在做的是在pack()
返回的对象上调用方法Label()
。链的最终返回值将是最后一个方法返回的值。 pack()
什么都不返回,所以返回值是None
,这就是分配给变量label
的内容。但是,如果你用Label()
结束链,那么返回值是一个标签对象,这就是label
中的内容。当您在单独的行上调用pack()
时,将丢弃返回值None
(它不会覆盖label
中的标签对象)。
希望这更清楚:)