如何使用包和网格布局将可滚动框架中的所有元素水平居中
How to horizontally center all the elements in a scrollable frame using pack and grid layout
我正在尝试学习如何使框架可滚动。现在我遇到了另一个问题,如何在该框架中水平居中所有小部件。标签、按钮都出现在左侧。我怎样才能将它们水平居中。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
container = tk.Frame(root)
container.pack(fill="both", expand=True)
canvas = tk.Canvas(container)
canvas.pack(side="left", fill="both", expand=True)
scrollbar = ttk.Scrollbar(container, orient="vertical", command=canvas.yview)
scrollbar.pack(side="right", fill="y")
canvas.configure(yscrollcommand=scrollbar.set)
scrollable_frame = ttk.Frame(canvas)
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(
scrollregion=canvas.bbox("all")
)
)
for i in range(50):
tk.Label(scrollable_frame, text="Sample text").grid(row=i, column=0)
tk.Button(scrollable_frame, text="Sample text").grid(row=i, column=1)
root.mainloop()
我想您可以在这里找到答案:
How to horizontally center a widget using grid()?
简而言之,由于您为 scrollable_frame (0,0) 提供的坐标,您的标签和按钮位于框架的左侧
尝试将它们修改为 (100, 0),您会看到所有内容都向右移动。然后,如果您知道框架的宽度,则可以使用变量使框架居中。
第一次在Whosebug上回复,希望不要太乱!
您可以计算 scrollable_frame
左上角的所需位置,并在 canvas 调整大小时使用 canvas.coords()
移动框架:
frame_id = canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
def on_canvas_resize(event):
x = (event.width - scrollable_frame.winfo_width()) / 2
canvas.coords(frame_id, (x, 0))
bbox = (0, 0, event.width, scrollable_frame.winfo_height())
canvas.config(scrollregion=bbox)
canvas.bind("<Configure>", on_canvas_resize)
我正在尝试学习如何使框架可滚动。现在我遇到了另一个问题,如何在该框架中水平居中所有小部件。标签、按钮都出现在左侧。我怎样才能将它们水平居中。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
container = tk.Frame(root)
container.pack(fill="both", expand=True)
canvas = tk.Canvas(container)
canvas.pack(side="left", fill="both", expand=True)
scrollbar = ttk.Scrollbar(container, orient="vertical", command=canvas.yview)
scrollbar.pack(side="right", fill="y")
canvas.configure(yscrollcommand=scrollbar.set)
scrollable_frame = ttk.Frame(canvas)
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(
scrollregion=canvas.bbox("all")
)
)
for i in range(50):
tk.Label(scrollable_frame, text="Sample text").grid(row=i, column=0)
tk.Button(scrollable_frame, text="Sample text").grid(row=i, column=1)
root.mainloop()
我想您可以在这里找到答案: How to horizontally center a widget using grid()?
简而言之,由于您为 scrollable_frame (0,0) 提供的坐标,您的标签和按钮位于框架的左侧 尝试将它们修改为 (100, 0),您会看到所有内容都向右移动。然后,如果您知道框架的宽度,则可以使用变量使框架居中。
第一次在Whosebug上回复,希望不要太乱!
您可以计算 scrollable_frame
左上角的所需位置,并在 canvas 调整大小时使用 canvas.coords()
移动框架:
frame_id = canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
def on_canvas_resize(event):
x = (event.width - scrollable_frame.winfo_width()) / 2
canvas.coords(frame_id, (x, 0))
bbox = (0, 0, event.width, scrollable_frame.winfo_height())
canvas.config(scrollregion=bbox)
canvas.bind("<Configure>", on_canvas_resize)