【问题标题】:tkinter 'NoneType' object has no attribute 'pack' (Still works?) [duplicate]tkinter'NoneType'对象没有属性'pack'(仍然有效?)[重复]
【发布时间】:2013-11-25 15:37:18
【问题描述】:

我对 Python 还很陌生,刚开始玩 tkinter。 运行下面的代码,我得到but1.pack() 的属性错误(NoneType 对象没有属性pack)。但据我所知,这个错误对窗口的功能没有影响,它仍然是packing 按钮。窗口仍然出现,所有按钮都按预期运行。

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

代码:

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'

【问题讨论】:

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


    【解决方案1】:

    当您收到诸如'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,并且对根窗口中的所有小部件只使用其中一个。

    【讨论】:

    • 如果我注释掉 pack() 行,那么按钮不会出现在框架中。我会在我认为的网格方法上做更多的阅读。感谢您的帮助。
    【解决方案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() 方法可能没有返回值。

    【讨论】:

    • 谢谢,这似乎是错误的原因。但是现在 .grid() 方法没有注册。按钮位于默认位置(即好像没有应用 grid() 方法)。
    • @I_do_python 那是因为grid()pack() 是互斥的。使用其中一种。
    • 谢谢琥珀。只要坚持网格,现在一切正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-05-07
    • 2016-09-20
    • 2013-06-25
    • 2018-09-12
    • 2019-11-09
    相关资源
    最近更新 更多