Tkinter中Frame位置仅显示单个像素且内部Button消失问题排查
问题根因
place布局的坐标是相对于父组件计算的:你将Button的父容器设置为自定义边框Frame,此时给Button设置的x=500、y=380是相对于Frame左上角的偏移量,而Frame默认尺寸极小,Button直接超出了Frame的可视范围,因此完全看不到。- Frame的
padx/pady属性仅在使用pack/grid布局管理内部组件时生效,你对Frame和内部Button都用place布局,这两个属性不会自动撑开Frame尺寸,Frame会缩到默认最小尺寸,所以你只能看到对应边框颜色的单个像素点。
修复方案
推荐直接改用pack布局管理Frame内的Button,不需要手动计算坐标,还能自动适配尺寸:
b_sel_date_border=Frame(x) b_sel_date_border["highlightthickness"]=5 b_sel_date_border["highlightbackground"]="#00f3b2" b_sel_date_border["bd"]=0 b_sel_date=Button(b_sel_date_border) b_sel_date["text"]="Select date" b_sel_date["bg"]="#310054" b_sel_date["fg"]="#00f3b2" b_sel_date["bd"]=0 b_sel_date["font"]=("Arial",12,"bold") b_sel_date["activebackground"]="#310054" b_sel_date["activeforeground"]="#00f3b2" # 内部按钮用pack,加padx/pady控制按钮和边框的间距 b_sel_date.pack(padx=50, pady=50) # Frame设置到目标位置即可 b_sel_date_border.place(x=500,y=380)
如果你坚持要使用place布局管理内部按钮,需要把Button的相对坐标改为Frame内的偏移量,同时给Frame设置足够的宽高:
b_sel_date_border=Frame(x, width=200, height=80) # 显式设置Frame宽高 b_sel_date_border["highlightthickness"]=5 b_sel_date_border["highlightbackground"]="#00f3b2" b_sel_date_border["bd"]=0 b_sel_date=Button(b_sel_date_border) b_sel_date["text"]="Select date" b_sel_date["bg"]="#310054" b_sel_date["fg"]="#00f3b2" b_sel_date["bd"]=0 b_sel_date["font"]=("Arial",12,"bold") b_sel_date["activebackground"]="#310054" b_sel_date["activeforeground"]="#00f3b2" # 坐标改为相对于Frame的偏移,比如左上角5,5的位置 b_sel_date.place(x=5, y=5) b_sel_date_border.place(x=500,y=380)
内容的提问来源于stack exchange,提问作者Vansh Kharidia
相关产品推荐
相关产品推荐

