3

我对 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'
4

2 回答 2

14

当您收到诸如 之类的错误时'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”对象没有属性“包”。

因此,直接的解决方法是将您的呼叫移至grid单独的行:

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

这样,错误就会消失。

但是,您还有另一个问题。打电话grid然后再打电话pack不会做你认为它会做的事情。对于任何给定的小部件,您一次只能有一个有效的几何管理器,并且两者grid都是pack几何管理器。如果你这样做了but1.grid(...)but1.pack(...)那么调用所产生的任何影响grid都将被丢弃,就好像你一开始就没有调用grid过一样。

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

于 2013-11-13T12:11:12.453 回答
2

尝试改变这个:

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()方法可能没有返回值。

于 2013-11-13T06:38:53.267 回答