我在使用Tkinter
和python
向网格布局添加滚动条时遇到问题。我在stackoverflow上找到了关于这个主题的类似帖子,但他们使用了我不想做的对象。
我正在使用canvas
我添加了frame
和scrollbar
,然后我将我的内容添加到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()
答案 0 :(得分:0)
你有两个问题。首先,您要将框架错误地添加到画布。画布只能滚动画布对象。这意味着您无法在画布中打包或网格化框架,您必须使用画布的create_window方法。
此外,您必须配置画布的可滚动区域,以便滚动条知道画布的可滚动程度。
例如,要设置可滚动区域以包含画布中的所有内容,您可以执行以下操作:
canvas.configure(scrollregion=canvas.bbox("all"))
这必须在添加项目后完成,因为bbox
方法返回区域的坐标(“边界框”),然后包含所有画布对象。)
使用它来控制框架时,必须确保在框架有机会布置其子框架后执行此操作。这是在回调画布的<Configure>
事件时完成的,每当画布调整大小或显示时都会发生这种情况。