我有一个简单的问题,为什么我应该在另一行中使用.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表现得那样?
答案 0 :(得分: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()
还是其他方法
特别的对象。
None
返回call1().call2().call3()....calln()
应该回来。
calln()
)被分配任何内容
lh = rh
中的表达式(如果有)返回。 rh
,grid
,pack
都是tkinter小部件上的方法,返回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
内的标签对象。)
希望这更清楚一点:)