为什么在另一行中使用pack()方法?

问题描述 投票:-1回答:2

我有一个简单的问题,为什么我应该在另一行使用.pack()

示例:如果我按如下方式调用Label函数:

import tkinter as tk

root = tk.Tk()
label = tk.Label(root, text="Sample Text").pack()

它在具有相同的效果:

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 python-3.x function methods tkinter
2个回答
1
投票

因为:

  1. 所有方法都返回一些东西,无论是None还是其他特定对象。
  2. call1().call2().call3()....calln()返回任何calln()应该返回的东西。
  3. 赋值的左侧(lh = rh)被赋值为rh返回的任何表达式(如果有的话)。

gridpackplace都是返回None小部件的方法(缺少实际的return语句时的默认返回值)。

这是一个非常相似的行为:

def return_a_list():
    return [0, 1]
rh = return_a_list().append(3)
lh = rh
input(lh)

0
投票

这与返回值有关。如果你是链接语句,那么你的返回值将是链中最后一个方法返回的值。 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中的标签对象)。

希望这更清楚:)

© www.soinside.com 2019 - 2024. All rights reserved.