Tkinter开发重量转换器时组件无法绑定到frame指定位置求助
问题根源
- 你混用了tkinter的三种布局管理器:
pack()、place()、create_window,同一个组件多次调用布局方法时,只有最后一次会生效,之前的布局配置会被直接覆盖 - 你给
labelanswer先调用了place(x=105, y=90)指定了在frame里的位置,后面又调用了labelanswer.pack(),直接把place的配置冲掉了,所以才会只能跑到顶部/底部,完全不受你之前的place参数控制 - 另外按钮和输入框、frame的父容器设置逻辑混乱,你想把结果放在frame里、输入框下方,就应该把相关组件的父容器统一设为frame,不要一部分挂在root上一部分挂在frame上
修正后可运行的代码
import tkinter as tk root = tk.Tk() root.resizable(False, False) root.title('Weight Converter') canvas = tk.Canvas(root, height=300, width=300, bg='teal') canvas.pack() # 统一把功能组件都放在frame里,方便管理位置 frame = tk.Frame(root, bg='white') frame.place(relwidth=0.8, relheight=0.8, relx=0.1, rely=0.1) # 标题放在frame顶部 labeltext = tk.Label(frame, text="Weight Converter", bg='white') labeltext.pack(pady=10) # 输入框放在标题下方 entry1 = tk.Entry(frame) entry1.pack(pady=10) # 结果标签放在输入框下方 labelanswer = tk.Label(frame, bg='white', width=20) labelanswer.pack(pady=10) # 按钮放在结果下方,横向排列 btn_frame = tk.Frame(frame, bg='white') btn_frame.pack(pady=10) def to_kg(): pound = float(entry1.get())*2.20462 labelanswer['text'] = f"转换结果:{round(pound,2)} 磅" def from_kg(): kg=float(entry1.get())/2.20462 labelanswer['text'] = f"转换结果:{round(kg,2)} 千克" b1 = tk.Button(btn_frame, text="转磅", bg='white', command=to_kg) b1.pack(side='left', padx=5) b2 = tk.Button(btn_frame, text='转千克', command=from_kg, bg='white') b2.pack(side='left', padx=5) root.mainloop()
布局使用注意
- 同一个父容器下尽量只用一种布局管理器,不要混用pack、place、grid
- 想要放在frame里的组件,创建的时候第一个参数就要传frame,不要传root
- 同一个组件不要多次调用布局方法,比如不要先写place又写pack,只有最后一次调用的布局会生效
内容的提问来源于stack exchange,提问作者R Errett
相关产品推荐
相关产品推荐

