菜鸟IT的博客 >> Python
给tkinter整个主界面增加横向滚动条和纵向滚动条
import tkinter as tk
def on_frame_configure(event):
# 更新画布的滚动区域以包含所有内容
canvas.configure(scrollregion=canvas.bbox("all"))
root = tk.Tk()
root.title("LabelFrame with Both Scrollbars")
# 创建LabelFrame
label_frame = tk.Frame(root)
label_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 在LabelFrame内部创建一个Frame用于放置滚动条和画布
inner_frame = tk.Frame(label_frame)
inner_frame.pack(fill=tk.BOTH, expand=True)
# 创建水平和垂直滚动条
xscrollbar = tk.Scrollbar(inner_frame, orient=tk.HORIZONTAL)
xscrollbar.pack(side=tk.BOTTOM, fill=tk.X)
yscrollbar = tk.Scrollbar(inner_frame, orient=tk.VERTICAL)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 创建画布,并指定滚动条的命令
canvas = tk.Canvas(inner_frame, bd=0, highlightthickness=0,xscrollcommand=xscrollbar.set, yscrollcommand=yscrollbar.set)
# 设置画布的大小(这里使用固定大小作为示例)
canvas_width, canvas_height = 400, 200
canvas.config(width=canvas_width, height=canvas_height)
# 将画布放置到内部框架中
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 绑定画布上的内容变化来更新滚动区域
canvas.bind("<Configure>", on_frame_configure)
# 在画布上创建一个Frame来放置实际的内容
content_frame = tk.Frame(canvas)
# 放置content_frame到canvas上(注意:这里我们使用了一个固定的ID)
content_id = canvas.create_window((0, 0), window=content_frame, anchor='nw')
# 当content_frame的大小改变时,更新画布上的窗口位置
def update_canvas_window(event):
# 注意:这里我们假设content_frame的大小已经通过某种方式改变
# 在实际情况下,你可能需要在这个函数中执行更复杂的逻辑
canvas.itemconfig(content_id, width=content_frame.winfo_width())
# 但是,上面的update_canvas_window函数并不适用于所有情况
# 因为Tkinter不会自动通知我们content_frame的大小变化
# 相反,我们需要确保在添加或删除内容后手动调用on_frame_configure
# 现在在content_frame中添加一些内容以测试滚动条
for i in range(10): # 纵向内容
for j in range(20): # 横向内容
tk.Label(content_frame, text=f"({i},{j})", width=10).grid(row=i, column=j, padx=2, pady=2)
# 更新画布的滚动区域以包含所有内容
on_frame_configure(None)
# 将滚动条与画布绑定
xscrollbar.config(command=canvas.xview)
yscrollbar.config(command=canvas.yview)
root.mainloop()
菜鸟IT博客[2024.08.10-09:26] 访问:56