使用tkinter的grid布局时Label超出嵌套Frame的问题求助
Tkinter Label未显示在嵌套Frame中的问题解决
嘿,我知道你为啥遇到这个问题了!你的代码里有个Tkinter新手很容易踩的小坑——grid()方法返回的是None,而不是你创建的Frame对象。
你看,你写的frame_1 = ttk.Frame(...).grid(...),其实是把grid()的返回值(也就是None)赋值给了frame_1,同理frame_2也变成了None。这就导致后面创建frame_2时,父组件是frame_1(也就是None),Tkinter会默认把None当成根窗口root,所以frame_2其实直接放在了root里,Label自然也跟着出现在根窗口,而不是你期望的嵌套Frame中。
修正后的代码
把创建Frame对象和调用布局方法分开写就解决了,另外我还加了点小优化让你能更清楚看到嵌套结构:
from tkinter import * from tkinter import ttk root = Tk() root.title("Tk test") root.geometry("800x800") # 先创建Frame对象,再单独调用grid布局 frame_1 = ttk.Frame(root, relief="sunken", height="400", width="400") frame_1.grid(row=0, column=0, rowspan=1, columnspan=1) # 禁止Frame根据子组件自动调整大小,保留你设置的固定尺寸 frame_1.grid_propagate(False) frame_2 = ttk.Frame(frame_1, relief="sunken", height="200", width="200") frame_2.grid(row=0, column=0, rowspan=1, columnspan=1) frame_2.grid_propagate(False) label_1 = ttk.Label(frame_2, text="Text") label_1.grid(row=0, column=0, sticky="NE") # sticky参数不需要逗号,直接写"NE"即可 root.mainloop()
额外说明
grid_propagate(False):Tkinter的Frame默认会根据子组件的大小自动收缩或扩展,加上这个方法可以固定你设置的height和width,这样你就能看到嵌套的sunken边框效果,更直观验证Label的位置。sticky="NE":参数里的逗号是多余的,直接写方向缩写就能让Label贴在所属Frame的右上角。
内容的提问来源于stack exchange,提问作者BrockenDuck
相关产品推荐
相关产品推荐

