如何在整个画布中制作水平滚动条并使其更宽?

问题描述

我已经在根目录(整个窗口)中创建了画布,并希望使其水平滚动。但是我的代码有问题,无法正常工作。我对Python很陌生,所以请耐心等待我的新手问题。

我还想知道如何使此滚动条更宽。我只发现了如何使它更高而不是更宽。

root = Tk()

canvas = Canvas(root,bg="blue",height=700,width=500)
canvas.grid(column=0,row=0)

scrollbar = Scrollbar(canvas,orient=HORIZONTAL,width=18)
scrollbar.config(command=canvas.xview)
canvas.config(xscrollcommand=scrollbar.set)
scrollbar.grid(column=0,row=9,pady=5,columnspan=4)

root.mainloop()

解决方法

画布需要知道应该通过滚动来访问较大的虚拟画布的哪一部分。您可以通过设置scrollregion属性来实现。 scrollregion定义了可滚动区域的左上角和右下角的坐标。

例如,如果您希望画布在屏幕上以500x700的区域显示,但要向右滚动以查看2000x700,则应执行以下操作:

canvas.configure(scrollregion=(0,2000,700))

注意:尚不清楚您是如何或是否向画布中添加内容的问题。上面的示例给出了固定的scrollregion。更常见的方法是在添加小部件后定义scrollregion,方法是使用bbox("all")获取画布上所有对象的边界框,如下所示:

canvas.configure(scrollregion=canvas.bbox("all"))

我还想知道如何使此滚动条更宽。我只发现了如何使它更高而不是更宽。

这通过使用packgrid来控制。此外,滚动条不应是画布的子级,它需要使用与画布相同的父级。

这是您的代码,其中包含必要的更改。我也将import语句更改为符合PEP8,并添加了一些刻度线,以便您可以在画布滚动时看到它。

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root,bg="blue",height=700,width=500)
scrollbar = tk.Scrollbar(root,orient="horizontal",width=18,command=canvas.xview)
canvas.configure(scrollregion=(0,700),xscrollcommand=scrollbar.set)

root.grid_rowconfigure(0,weight=1)
root.grid_columnconfigure(0,weight=1)

canvas.grid(column=0,row=0,sticky="nsew")
scrollbar.grid(row=1,column=0,sticky="ew")

# this adds tick-marks every 100 pixels so that you can
# see the canvas scroll
for x in range(0,2001,100):
    anchor = "sw" if x < 100 else ("se" if x==2000 else "s")
    canvas.create_line(x,700,x,690,fill="red")
    canvas.create_text(x,680,text=x,anchor=anchor)

root.mainloop()