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)