Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter滚动条未正确填充或对齐_Python_Tkinter - Fatal编程技术网

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订单,但我猜不是!