如何修复tkinter滚动条灰显、无法正常滚动工作的问题
问题根因
你的滚动条灰显无法使用,是两个核心错误导致的:
- 新增图片的Label父容器选错了:你把
panel2放到了外层的main_frame里,而滚动区域绑定的是画布内嵌的second_frame的尺寸变化,second_frame高度不会随着你新增图片变化,滚动区域自然不会更新。 - 用
place布局新增的Label,second_frame不会自动计算place控件的尺寸,就算你改对父容器,画布也检测不到内容高度变化。
修复后的完整代码
import tkinter as tk from tkinter import ttk root = tk.Tk() root.geometry('800x800') box_image = tk.PhotoImage(file='apple.png') ### 滚动条部分 ### # 创建主框架 main_frame = tk.Frame(root) main_frame.pack(fill='both', expand=1) # 创建画布 my_canvas = tk.Canvas(main_frame) my_canvas.pack(side='left', fill='both', expand=1) # 为画布添加滚动条 my_scrollbar = ttk.Scrollbar(main_frame, orient='vertical', command=my_canvas.yview) my_scrollbar.pack(side='right', fill='y') # 配置画布 my_canvas.configure(yscrollcommand=my_scrollbar.set) # 绑定画布尺寸变化时,自动适配second_frame宽度 def on_canvas_configure(e): my_canvas.itemconfig(canvas_window, width=e.width) my_canvas.configure(scrollregion = my_canvas.bbox("all")) my_canvas.bind('<Configure>', on_canvas_configure) # 在画布内部创建次级框架 second_frame = tk.Frame(my_canvas) # 将次级框架添加到画布的窗口中,保存窗口id用于后续适配宽度 canvas_window = my_canvas.create_window((0,0), window=second_frame, anchor="nw") # 新增每次内容变化时更新滚动区域的函数 def update_scrollregion(): second_frame.update_idletasks() my_canvas.configure(scrollregion=my_canvas.bbox("all")) def display(): # 父容器改成second_frame,用pack布局,不需要手动算坐标 panel2 = tk.Label(second_frame, image=box_image, bg='#f7f6f6') panel2.pack(pady=20) # 上下间距可自行调整 # 新增完成后更新滚动区域 update_scrollregion() button = tk.Button(second_frame, text="点击我", command=display) button.pack(pady=10) label = tk.Label(second_frame, text="标签", bg="blue") label.pack(fill="x", padx=50) new_frame = tk.Frame(second_frame, bg='black', height=110) new_frame.pack(fill="x") # 初始化一次滚动区域 update_scrollregion() root.mainloop()
额外说明
如果一定要用place布局放图片,需要在每次新增图片后手动计算second_frame的高度,再更新scrollregion,相比pack/grid布局会更麻烦。
内容的提问来源于stack exchange,提问作者Minbutt
相关产品推荐
相关产品推荐

