【发布时间】:2013-04-17 19:02:30
【问题描述】:
我的目标是在其中包含多个标签的框架中添加一个垂直滚动条。只要框架内的标签超过框架的高度,滚动条就会自动启用。经过搜索,我发现this 有用的帖子。根据那篇文章,我知道为了实现我想要的,(如果我错了,请纠正我,我是初学者)我必须先创建一个 Frame,然后在该框架内创建一个 Canvas 并粘贴滚动条到该框架。之后,创建另一个框架并将其作为窗口对象放在画布内。所以,我终于想出了这个:
from Tkinter import *
def data():
for i in range(50):
Label(frame,text=i).grid(row=i,column=0)
Label(frame,text="my text"+str(i)).grid(row=i,column=1)
Label(frame,text="..........").grid(row=i,column=2)
def myfunction(event):
canvas.configure(scrollregion=canvas.bbox("all"),width=200,height=200)
root=Tk()
sizex = 800
sizey = 600
posx = 100
posy = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)
canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()
- 我做得对吗?有没有更好/更智能的方法来实现这段代码给我的输出?
- 为什么必须使用网格法? (我尝试了 place 方法,但画布上没有出现任何标签。)
- 在画布上创建窗口时使用
anchor='nw'有什么特别之处?
由于我是初学者,请保持简单的回答。
【问题讨论】:
-
尽管代码乍一看似乎是正确的,但您的问题却倒退了。您必须创建一个框架,将其嵌入到画布中,然后将滚动条附加到画布上。
-
@TrevorBoydSmith 有很多东西可能是重复的,但我投票决定将其关闭为另一个似乎有最佳答案的重复:stackoverflow.com/questions/1873575/…
-
我迟到了,但非常感谢您!这是仅使用纯 Tkinter(我的项目的一个限制)创建可滚动框架的唯一全功能(和完整)示例。我知道这不是你的本意,但谢谢!
-
当我将这个框架原样放在另一个框架内并使用网格来绘制它时,它会以某种方式变得比允许的大得多。如何确保画布保持在其父框架的边框内?
标签: python tkinter scrollbar frame