Python Tkinter滚动条未正确填充或对齐
我试图创建一个包含垂直和水平滚动条的框架,但水平滚动条似乎放在画布旁边,而不是画布下面。我的滚动条中有Python Tkinter滚动条未正确填充或对齐,python,tkinter,Python,Tkinter,我试图创建一个包含垂直和水平滚动条的框架,但水平滚动条似乎放在画布旁边,而不是画布下面。我的滚动条中有side=tk.BOTTOM和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=
side=tk.BOTTOM
和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()
然而,由于当涉及到更复杂的GUI时,pack
不是那么直观,所以我更喜欢使用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将填充所有可用空间。在我的环境中,在定义y和xscrollbar后调用canvas.pack和frame.pack效果良好
import tkinter as tk
from tkinter import ttk
root=tk.Tk()
frame=tk.Frame(root)
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=tk.Canvas(frame, height=200, width=200, background="blue")
canvas.pack(side=tk.LEFT)
frame.pack()
canvas.configure(yscrollcommand=yscrollbar.set)
canvas.configure(xscrollcommand=xscrollbar.set)
root.mainloop()
谢谢-我可以发誓我测试了
pack
ing订单,但我猜不是!