首页 > 解决方案 > Tkinter 滚动条未正确填充或对齐

问题描述

我正在尝试创建一个同时具有垂直和水平滚动条的框架,但水平滚动条似乎紧挨着画布,而不是在画布下方。我的滚动条带有side=tk.BOTTOMand fill=tk.X,所以我不确定我还需要添加什么。我应该怎么做才能让水平滚动条横跨整个画布?

import tkinter as tk
from tkinter import ttk

root=tk.Tk()

frame=tk.Frame(root)
frame.pack()

canvas=tk.Canvas(frame, height=200, width=200, background="blue")
canvas.pack(side=tk.LEFT)

yscrollbar=tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)

xscrollbar=tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=canvas.xview)
xscrollbar.pack(side=tk.BOTTOM, fill=tk.X)

canvas.configure(yscrollcommand=yscrollbar.set)
canvas.configure(xscrollcommand=xscrollbar.set)

root.mainloop()

在此处输入图像描述

现在canvas设置为side=tk.LEFT. 如果我将其设置为side=tk.TOP,则会发生相反的问题。

在此处输入图像描述

标签: pythontkinter

解决方案


问题来自您打包小部件的顺序。这个想法是 pack 使用剩余的空间来放置剩下的东西,所以你需要先打包滚动条,然后最后打包画布:

import tkinter as tk
from tkinter import ttk

root=tk.Tk()

frame=tk.Frame(root)
frame.pack()

canvas=tk.Canvas(frame, height=200, width=200, background="blue")

yscrollbar=tk.Scrollbar(frame, orient=tk.VERTICAL, command=canvas.yview)


xscrollbar=tk.Scrollbar(frame, orient=tk.HORIZONTAL, command=canvas.xview)

xscrollbar.pack(side=tk.BOTTOM, fill=tk.X)
yscrollbar.pack(side=tk.RIGHT, fill=tk.Y)
canvas.pack(side=tk.LEFT)

canvas.configure(yscrollcommand=yscrollbar.set)
canvas.configure(xscrollcommand=xscrollbar.set)

root.mainloop()

截图

但是,因为pack在涉及更复杂的 GUI 时不是那么直观,所以我更喜欢使用grid

xscrollbar.grid(row=1, column=0, sticky='ew')
yscrollbar.grid(row=0, column=1, sticky='ns')
canvas.grid(row=0, column=0, sticky='ewns')

但在这种情况下,如果您希望 GUI 正确调整大小,则需要添加

frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)

这样网格的第 0 行和第 0 列将填满所有可用空间。


推荐阅读