Tkinter问题:子框架在某一父框架中不显示但在其他框架中正常?
问题原因
- 二级框架
Transformations_left未调用布局方法:Tkinter中所有组件创建完成后,必须调用grid()/pack()/place()三种布局方法中的一种,才会被渲染到父容器中,你只创建了该框架但没有执行布局操作,因此它不会显示。 - 标签重复布局导致位置冲突:你创建完
Transformations_left后,错误地再次调用了Label_Header.grid()。此时Label_Header变量已经指向Header容器中第二个标签(文本为"PLACEHOLDER FOR LINKS"的标签),重复调用grid会将该标签从原位置(0,1)移动到(0,0),直接覆盖了同位置的第一个Header标签,因此出现原有标签消失的问题。
修复代码
import tkinter as tk # create root root = tk.Tk() appTitle = "Fotoshoop" root.title(appTitle) factor = 1.618 rootWidth = 800 rootHeight = int(rootWidth / factor) geo = "{}x{}".format(str(rootWidth), str(rootHeight)) root.geometry(geo) # LAYER 1 l1padx = 10 l1pady = l1padx l1w = 200 l1h = int(l1w / factor) l1color = "gray" Header = tk.Frame(root, bg=l1color, width=l1w, height=l1h) Header.grid(row=0, column=0, ipadx=l1padx, ipady=l1pady, padx=l1padx, pady=l1pady) Transformations = tk.Frame(root, bg=l1color, width=l1w, height=l1h) Transformations.grid(row=1, column=0, ipadx=l1padx, ipady=l1pady, padx=l1padx, pady=l1pady) Content = tk.Frame(root, bg=l1color, width=l1w, height=l1h) Content.grid(row=2, column=0, ipadx=l1padx, ipady=l1pady, padx=l1padx, pady=l1pady) # LAYER 2 l2padx = 5 l2pady = l2padx l2color = "blue" msg_header = "Welcome!" # 不同组件使用不同变量名,避免覆盖误操作 Label_Header1 = tk.Label(Header, bg=l2color, text=msg_header) Label_Header1.grid(row=0, column=0, ipadx=l2padx, ipady=l2pady, padx=l2padx, pady=l2pady) Label_Header2 = tk.Label(Header, bg=l2color, text="PLACEHOLDER FOR LINKS") Label_Header2.grid(row=0, column=1, ipadx=l2padx, ipady=l2pady, padx=l2padx, pady=l2pady) # 给二级框架调用grid方法完成布局 Transformations_left = tk.Frame(Transformations, bg=l2color, width=100, height=50) Transformations_left.grid(row=0, column=0, ipadx=l2padx, ipady=l2pady, padx=l2padx, pady=l2pady ) root.mainloop()
补充建议
- 不同组件尽量使用不同的变量名,避免变量被覆盖后误操作原有组件
- 如果需要固定框架大小不受子组件影响,可以给框架调用
grid_propagate(False)(使用grid布局的场景)或者pack_propagate(False)(使用pack布局的场景)
内容的提问来源于stack exchange,提问作者ExactPlace441
相关产品推荐
相关产品推荐

