tkinter'NonType'对象没有属性'pack'(仍然有效?)

I_d*_*hon 0 python windows windows-xp tkinter python-3.x

我是Python的新手,刚刚开始使用tkinter.运行下面的代码我得到一个属性错误but1.pack()(NoneType对象没有属性pack).但据我所知,这个错误对窗口的功能没有任何影响,它仍然pack是按钮.窗口仍然出现,所有按钮都按预期运行.

搜索我可以看到其他人有这个错误,但没有给出的答案解决了我的问题.希望你能提供帮助.

代码:

import tkinter
import ctypes
lst=[]

user32 = ctypes.windll.user32
screensize = user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)

def closewindow():
    window.destroy()
def btn1():
    lst.append("Button1")
def btn2():
    lst.append("Button2")

window = tkinter.Tk()

size = str(screensize[0])+'x'+str(screensize[1])
window.geometry(size)

but1 = tkinter.Button(window, text="Button1", command=btn1).grid(column = 1, row = 1)
but2 = tkinter.Button(window, text="Button2", command=btn2).grid(column = 2, row = 1)
ext = tkinter.Button(window, text="Stop", command=closewindow).grid(column = 3, row = 1)

but1.pack()
but2.pack()
ext.pack()

window.mainloop()
Run Code Online (Sandbox Code Playgroud)

回调;

Traceback (most recent call last):
  File "C:\Python33\temp.py", line 59, in <module>
    but1.pack()
AttributeError: 'NoneType' object has no attribute 'pack'
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 6

当你得到一个错误,例如'NoneType' object has no attribute 'X',这意味着你有一个值为的变量None,而你正试图这样做None.X().如果您正在使用tkinter或任何其他包,则无关紧要.所以,你必须问自己,"为什么我的变量有价值None?"

问题是这一行:

but1 = tkinter.Button(window, text="Button1", command=btn1).grid(column = 1, row = 1)
Run Code Online (Sandbox Code Playgroud)

在python中,当你这样做时foo=x(...).y(...),foo将始终具有调用的最后一个函数的值.在上面的例子中,but将返回由返回的值.grid(column = 1, row = 1),并grid始终返回None.因此,but1None,因而你得到''NoneType'对象没有属性'pack'".

因此,立即解决方法是将您的呼叫转移grid到单独的线路:

but1 = tkinter.Button(window, text="Button1", command=btn1)
but1.grid(column = 1, row = 1)
Run Code Online (Sandbox Code Playgroud)

有了这个,错误就会消失.

但是,你有另一个问题.打电话grid然后打电话pack不会做你认为会做的事情.您只能有一个效果几何管理器在同一时间对于任何给定部件,都gridpack有几何经理.如果你这样做but1.grid(...),之后but1.pack(...),任何调用的效果grid都将被丢弃,就像你从未调用grid过一样.

您必须决定是否要使用grid,或者是否要使用pack,并且只对根窗口中的所有小部件使用一个或另一个.