Tkinter网格布局垂直滚动条

时间:2015-07-06 12:04:46

标签: python tkinter scrollbar

我在使用Tkinterpython向网格布局添加滚动条时遇到问题。我在stackoverflow上找到了关于这个主题的类似帖子,但他们使用了我不想做的对象。

我正在使用canvas我添加了framescrollbar,然后我将我的内容添加到frame

显示此内容时,内容按预期显示,scrollbar也存在,但scrollbar无效。

有人可以在下面的代码中帮助识别问题(不使用对象)吗?

from Tkinter import *
top = Tk()
top.geometry("100x100+10+10")
ALL = N+S+E+W
padding = 2
width = 3

frame = Frame(top)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)
frame.pack(expand=1, fill=BOTH, padx=1, pady=1)

canvas = Canvas(frame)
canvas.grid(row=0, column=0, sticky=NW+SE)

def add_checkbox(x,y):
    check = IntVar()
    Checkbutton(canvas,     variable=check).grid(row=x,column=y,padx=padding,pady=padding)

def add_label(x,y,text):
    Label(canvas, text=text).grid(row=x, column=y, padx=padding, pady=padding)  

add_label(0,0,"x")
add_label(1,0,"y") 
add_label(2,0,"z") 
add_label(3,0,"1") 
add_label(4,0,"2") 
add_label(5,0,"3") 
add_label(5,0,"4") 
add_label(5,0,"5") 
add_label(5,0,"6") 

Button(frame, text="Submit").grid(row=3, column=0, columnspan=width, sticky=ALL)

yscrollbar = Scrollbar(frame, orient=VERTICAL)
yscrollbar.grid(row=0, column=1, sticky=NE+SE)

canvas.configure(yscrollcommand=yscrollbar.set,     scrollregion=canvas.bbox("all"))
canvas.create_window((4,4), window=frame, anchor="nw")
yscrollbar.configure(command=canvas.yview)

frame.pack()
top.mainloop()

1 个答案:

答案 0 :(得分:0)

你有两个问题。首先,您要将框架错误地添加到画布。画布只能滚动画布对象。这意味着您无法在画布中打包或网格化框架,您必须使用画布的create_window方法。

此外,您必须配置画布的可滚动区域,以便滚动条知道画布的可滚动程度。

例如,要设置可滚动区域以包含画布中的所有内容,您可以执行以下操作:

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

这必须在添加项目后完成,因为bbox方法返回区域的坐标(“边界框”),然后包含所有画布对象。)

使用它来控制框架时,必须确保在框架有机会布置其子框架后执行此操作。这是在回调画布的<Configure>事件时完成的,每当画布调整大小或显示时都会发生这种情况。