我对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'
答案 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
。因此,but1
是None
,因此你得到''NoneType'对象没有属性'pack'“。
因此,立即解决方法是将您的电话号码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
,并且只对根窗口中的所有小部件使用一个或另一个。
答案 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()
方法没有返回值。