问题描述
我已经创建了一个画布c,我想在画布中放置一个滚动条以上下滚动我放置在画布中的所有内容(我打算放置很多东西)。但是滚动条不起作用。我在做什么错了?
if (F)
解决方法
这里有一些问题。首先,标签不是画布项目,它们是您自己网格化到根目录中的自己的小部件。 (虽然您确实将画布作为其父对象,但这是行不通的,但是由于画布的工作原理,它实际上只是将其传递到了根目录而不是出错-很好,但这是因为方式。)
接下来,您使用第一个标签(其中i = 0)覆盖了放置画布的0、0网格,因此画布甚至不显示。
接下来,您将滚动条放在第2列中,而只是跳过了第1列。这没什么问题(也许您以后会在第1列中放一些东西,谁知道,)我只是想确保您知道什么在那里发生。
您真正需要弄清楚的是,如果您想滚动画布或滚动一些小部件(例如标签,按钮等)。如果真的要滚动画布,请查看http://effbot.org/zone/tkinter-scrollbar-patterns.htm#canvas 为了方便起见,我在此处添加了一个代码段(在画布上添加了一些元素,以便您可以真正看到滚动条),如果您只想复制和粘贴:
from tkinter import *
root = Tk()
frame = Frame(root,bd=2,relief=SUNKEN)
frame.grid_rowconfigure(0,weight=1)
frame.grid_columnconfigure(0,weight=1)
xscrollbar = Scrollbar(frame,orient=HORIZONTAL)
xscrollbar.grid(row=1,column=0,sticky=E+W)
yscrollbar = Scrollbar(frame)
yscrollbar.grid(row=0,column=1,sticky=N+S)
canvas = Canvas(frame,bd=0,scrollregion=(0,1000,1000),xscrollcommand=xscrollbar.set,yscrollcommand=yscrollbar.set)
canvas.grid(row=0,sticky=N+S+E+W)
xscrollbar.config(command=canvas.xview)
yscrollbar.config(command=canvas.yview)
for i in range(100):
canvas.create_rectangle(
i/10*100,i%10*100,i/10*100+50,i%10*100+50,fill='green')
frame.pack()
如果您实际上只是想要一个滚动区域,可以在其中放置任何想要的小部件,那么在线人士似乎推荐的是拿起滚动画布并在其中放入一个窗口,然后在该窗口中添加您的物品。因此,您在正确的方向上可以做到这一点。您还希望滚动区域配置在每次移动时都发生,而不是在每次移动时发生。 这是您所拥有物品的修改版本:
from tkinter import *
root = Tk()
frame = Frame(root,width=160,height=100)
c=Canvas(frame)
c.config(width=160,height=100)
c.pack(side=LEFT)
def innerFrameGo(_):
c.configure(scrollregion=c.bbox('all'))
inner_frame = Frame(c)
inner_frame.bind("<Configure>",innerFrameGo)
inner_frame_id = c.create_window(0,window=inner_frame,anchor=NW)
Scrb=Scrollbar(frame,orient=VERTICAL)
Scrb.pack(side=RIGHT,fill=Y)
c.configure(yscrollcommand=Scrb.set)
Scrb.config(command=c.yview)
frame.pack()
for i in range(0,7):
label = Label(inner_frame,text="this is to fill room")
label.grid(row=i,column=0)
root.mainloop()
P.S。关于您制作的标签列表...如果您要一遍又一遍地输入内容,这是一个很好的信号,表明您可以更轻松地完成您要尝试的操作。既然您还是要进行for循环,那么我将该部分移到了那里。