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

时间:2018-03-01 21:12:39

标签: python python-3.x function methods tkinter

我有一个简单的问题,为什么我应该在另一行中使用.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")

为什么表现得那样?

2 个答案:

答案 0 :(得分:1)

由于:

  1. 所有方法都会返回一些内容,无论是public class ValidateAccessAttribute2 : ActionFilterAttribute { private readonly FunctionalArea _area; public ValidateAccessAttribute2(FunctionalArea area) { _area = area; } public override void OnActionExecuting(HttpActionContext actionContext) { base.OnActionExecuting(actionContext); if (!actionContext.Request.Headers.Contains(AuthorizationHeaders.UserNameHeader)) { actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden); return; } var userName = actionContext.Request.Headers.GetValues("UserNameHeader").First(); if (!UserCanAccessArea(userName, _area)) { actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden); return; } } } [ValidateAccess2(FunctionalArea.AccessToGenericStuff)] public async Task<IHttpActionResult> Stuff() 还是其他方法 特别的对象。

  2. None返回call1().call2().call3()....calln() 应该回来。

  3. 任务的左侧(calln())被分配任何内容 lh = rh中的表达式(如果有)返回。
  4. rhgridpack都是小部件上的方法,返回place(默认返回值为没有实际的None陈述。

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

    return

答案 1 :(得分:0)

这与返回值有关。如果你是链接语句,那么你的返回值将是链中最后一个方法返回的值。 Label()返回标签对象。 pack()返回None。您现在可以想象错误“类型对象没有属性'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内的标签对象。)

希望这更清楚一点:)