近一个星期以来,我一直在学习如何使用 Tkinter 在 python 中创建 Gui。当在周围创建自由空间或创建一个盒子并使用容器确定小部件的尺寸时,Frame
您不能修改诸如padding
、borderwidht
或的属性widht
。
这是我的代码:
from tkinter import *
from tkinter import ttk
root=Tk()
mainframe=ttk.Frame(root, ).grid()
mainframe['padding']=(5,10)#esta linea es la que me genera problemas y es de igual forma si quiero usar borderwidht o widht
etiqueta=ttk.Label(root,text="try").grid(row=0, column=2)
buton=ttk.Button(mainframe,text="push here",command=root.quit).grid(row=1, column=24)
root.mainloop()
结果是:
回溯(最近一次通话最后):
文件“/home/wonder/PycharmProjects/untitled/essays tkinter.py”,第 8 行,在 <module>
mainframe['padding']=(5,10)
TypeError: 'NoneType' object不支持项目分配
我究竟做错了什么?
这是 Tkinter 中非常常见的错误。问题是使用
grid
,place
或pack
在实例化小部件的同一行上。节省台词很好,但有时它有它的后果ツ。如果这样做:
mainframe
不是一个对象ttk.Frame
,它是方法的返回grid
,它不返回任何东西(None
)。这就是为什么错误说:如果以后要使用对象的名称来更改其属性,则需要将实例与方法调用分开
grid
:您可以通过在这两种情况下执行简单的操作(例如打印大型机变量)来查看差异:
在输出中我们看到了不同之处:
尝试链接小部件的方法调用时会出现完全相同的问题:
在这种情况下错误和问题是相同的,
Entry()
创建一个类的对象Entry
,然后.grid()
调用该grid
对象的方法,到目前为止一切顺利。然后它.config()
尝试调用config
网格输出(None
)方法,这里我们遇到了和以前一样的问题。为了使上述工作正常,每个方法都应该返回对其所属对象的引用,也就是说,它可以grid
返回对使用Entry()
and not创建的对象的引用None
。解决方法是一样的:如果我们不再需要再次引用小部件,则在同一行应用该方法是正确的,但在这种情况下,不应将变量与输出关联,因为我们将有很多变量,所有变量都关联
None
并且完全无用。而不是这样做:我们只需要这样做:
另一方面,这本身并不是一个错误,而是一个非常糟糕的做法,由于某种原因在 Tkinter 教程中很普遍,你不应该以这种方式在 Python 中导入模块(除了合理的情况,主要是合并两个空格名称):
您的代码很简单,一开始不会给您带来问题,但在使用复杂模块或中型项目时可能会引起很多麻烦。这种形式的导入会暴露当前命名空间中的所有模块标识符。原则上,您不知道模块包含的所有类、对象或函数的名称,因此您最终可能会在您的 Tkinter 函数命名空间中覆盖您自己的函数,反之亦然,而不会意识到这一点。另一方面,它使第三方难以阅读代码(“显式优于隐式”)。
正确的方法是使用其中之一:
您的代码可能如下所示:
结果:
版:
参数
weidht
和height
指定与其余相同,只是如果我们想避免布局进行自动调整并且小部件被迫采取这些措施,我们需要一起使用该方法:grid_propagate()