python - Tkinter 滚动条未正确填充或对齐
问题描述
我正在尝试创建一个同时具有垂直和水平滚动条的框架,但水平滚动条似乎紧挨着画布,而不是在画布下方。我的滚动条带有side=tk.BOTTOM
and 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
,则会发生相反的问题。
解决方案
问题来自您打包小部件的顺序。这个想法是 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 列将填满所有可用空间。
推荐阅读
- python - 定义可选函数参数的类型
- json - 无法将类型“[Surah]”的值转换为预期的参数类型“范围”
' - java - 通过套接字的双向文件传输中的 InputStream 干扰
- excel - 根据 2 个不同的条件集从第三个表中求和
- r - 当x轴未完全对齐时如何在R中绘制多条线
- spring - intellij 和嵌入式 Jetty - 创建带有名称的 bean 时出错
- java - PDFBox - 正在旋转的覆盖内容
- python - 如何使用python在字符串中找到确切的字符串
- svm - 与实际 SMOreg 预测结果相比,来自 GridSearch 的最佳超参数给出了相反的结果
- arrays - SwiftUI 组合来自两个不同数组的两个 ObservedObjects