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

时间:2013-11-13 06:31:44

标签: python windows python-3.x tkinter windows-xp

我对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()

回调;

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

2 个答案:

答案 0 :(得分: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)

在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)

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

但是,您还有另一个问题。调用grid然后再调用pack将不会按照您的想法执行操作。对于任何给定的窗口小部件,您一次只能有一个几何管理器生效,gridpack都是几何管理器。如果您执行but1.grid(...)及之后的but1.pack(...),那么调用grid的任何效果都将被丢弃,就像您从未调用grid一样。

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

答案 1 :(得分:1)

尝试更改此内容:

but1 = tkinter.Button(window, text="Button1", command=btn1).grid(column = 1, row = 1)

进入这个:

but1 = tkinter.Button(window, text="Button1", command=btn1)
but1.grid(column = 1, row = 1)

有可能.grid()方法没有返回值。