如何读取小部件的内边距属性值
下面是一个示例程序,它为标签设置了两个选项text和padding。
import tkinter as tk
import tkinter.ttk
root = tk.Tk()
root.geometry("300x200")
label = tk.ttk.Label(root, background="red")
label.pack()
label.configure(text="Label")
print(label.configure("text")[-1])
label.configure(padding=(100, 50))
print(label.configure("padding")[-1])
root.mainloop()

从print输出看,text选项被作为字符串"Label"返回,符合预期。然而,padding,尽管被设置为整数元组,现在却以“像素对象”的元组形式返回:
Label
(<pixel object: '100'>, <pixel object: '50'>)
那些对象到底是什么?我是不是用错了读取数值的方法?是否存在一个内置的方法来解析这些对象,是我应该使用的?
在网上研究时,我发现有几种读取小部件选项的方法,但它们的结果都是一样的:
>>> label.configure("padding")[-1]
(<pixel object: '100'>, <pixel object: '50'>)
>>> label.cget("padding")
(<pixel object: '100'>, <pixel object: '50'>)
>>> label["padding"]
(<pixel object: '100'>, <pixel object: '50'>)
对这些“像素对象”的进一步调查:
>>> type(label.configure("padding")[-1][0])
<class '_tkinter.Tcl_Obj'>
>>> dir(label.configure("padding")[-1][0])
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'string', 'typename']
以上运行结果所用的系统:
>>> sys.version
'3.9.2 (default, Feb 28 2021, 17:03:44) \n[GCC 10.2.1 20210110]'
>>> tk.Tcl().call("info", "patchlevel")
'8.6.11'
切换到另一套系统:
>>>> sys.version
'3.11.13 (413c9b7f57f5, Jul 03 2025, 18:03:56)\n[PyPy 7.3.20 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)]'
>>>> tk.Tcl().call("info", "patchlevel")
'8.6.14'
现在,我得到一个不同的返回值,这其实就是一个整数元组:
>>>> label.configure("padding")[-1]
(100, 50)
既然版本显然会影响返回值,难道不应该提供一个抽象的内置方法来解析这些值吗?
解决方案
padding 正在作为Tk距离对象返回,而不是普通的Python整数。
Tkinter/ttk在内部以Tcl/Tk屏幕距离的形式存储几何相关的数值(padding、width 等),因此tkinter将它们保留为Tcl对象,而不是自动转换成int。
你的代码没问题——如果你想要普通的Python整数,需要显式地进行转换:
padding = tuple(map(int, label.configure("padding")[-1]))
print(padding)
# (100, 50)
你也可以直接通过小部件选项访问它们:
x, y = label["padding"]
print(int(x), int(y))
之所以会这样,是因为Tk距离并不局限于原始像素。像这样的数值也是有效的:
label.configure(padding=("2c", "1c"))
因此tkinter并不能总是默认这些数值应该立即转换为整数。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。