Python 为什么我的Tkinter滚动条位于区域it';它应该滚动吗?

Python 为什么我的Tkinter滚动条位于区域it';它应该滚动吗?,python,tkinter,Python,Tkinter,简而言之,我的问题是,在我正在编写的GUI中,滚动条重叠在框架右边缘的顶部,而不是像预期的那样与之相邻。我做错了什么?一段再现问题的代码: root=Tk() root.title('Window Test') root.grid_rowconfigure(0,weight=1) overall=Frame(root) overall.grid(row=0,column=0,sticky=N+E+S+W) overall.grid_rowconfigure(0,weight=1) oute

简而言之,我的问题是,在我正在编写的GUI中,滚动条重叠在框架右边缘的顶部,而不是像预期的那样与之相邻。我做错了什么?一段再现问题的代码:


root=Tk()
root.title('Window Test')
root.grid_rowconfigure(0,weight=1)

overall=Frame(root)
overall.grid(row=0,column=0,sticky=N+E+S+W)
overall.grid_rowconfigure(0,weight=1)

outercanvas=Canvas(overall)
outercanvas.grid(row=0,column=0)
outerSframe=LabelFrame(outercanvas,text='Outer')
outerSB=Scrollbar(overall,command=outercanvas.yview)
outercanvas.config(yscrollcommand=outerSB.set)
outerSframe.bind('<Configure>',lambda e: outercanvas.configure(scrollregion=outercanvas.bbox('all')))
outercanvas.create_window((0,0),window=outerSframe,anchor=NW)
outerSB.grid(row=0,column=1,sticky=N+E+S)

innercanvas=Canvas(outerSframe)
innercanvas.grid(row=0,column=0)
innerSframe=LabelFrame(innercanvas,text='Inner')
innercanvas.create_window((0,0),window=innerSframe,anchor=NW)
Label(innerSframe,text='123456789012345678901234567890').pack()

root=Tk()
root.title('窗口测试')
root.grid_rowconfigure(0,权重=1)
总体=帧(根)
整体.grid(行=0,列=0,粘性=N+E+S+W)
总体.grid_rowconfigure(0,权重=1)
outercanvas=画布(总体)
outercanvas.grid(行=0,列=0)
outerFrame=LabelFrame(outercanvas,text='Outer')
outerSB=滚动条(整体,命令=outercanvas.yview)
outercanvas.config(yscrollcommand=outerSB.set)
outerFrame.bind(“”,lambda e:outercanvas.configure(scrollregion=outercanvas.bbox('all'))
outercanvas.create_window((0,0),window=outerSframe,anchor=NW)
outerSB.grid(行=0,列=1,粘性=N+E+S)
innercanvas=画布(OuterFrame)
网格(行=0,列=0)
innerSframe=LabelFrame(innercanvas,text='Inner')
innercanvas.create_window((0,0),window=innerSframe,anchor=NW)
标签(innerSframe,text='1234567890012345678901234567890').pack()

这是因为您的代码没有指定
外部通道的宽度。您应该根据绑定到
事件的
外部帧
内部回调的宽度设置其宽度:

def on_frame_resize(event):
    bbox = outercanvas.bbox('all')
    outercanvas.config(scrollregion=bbox, width=bbox[2]) # update width as well

root=Tk()
root.title('Window Test')
root.grid_rowconfigure(0,weight=1)

overall=Frame(root)
overall.grid(row=0,column=0,sticky=N+E+S+W)
overall.grid_rowconfigure(0,weight=1)

outercanvas=Canvas(overall)
outercanvas.grid(row=0,column=0)
outerSframe=LabelFrame(outercanvas,text='Outer')
outerSB=Scrollbar(overall,command=outercanvas.yview)
outercanvas.config(yscrollcommand=outerSB.set)
outerSframe.bind('<Configure>', on_frame_resize) # changed to a function instead of lambda
outercanvas.create_window((0,0),window=outerSframe,anchor=NW)
outerSB.grid(row=0,column=1,sticky=N+E+S)

innercanvas=Canvas(outerSframe)
innercanvas.grid(row=0,column=0)
innerSframe=LabelFrame(innercanvas,text='Inner')
innercanvas.create_window((0,0),window=innerSframe,anchor=NW)
Label(innerSframe,text='123456789012345678901234567890').pack()

root.mainloop()
def on_frame_resize(事件):
bbox=outercanvas.bbox('all')
outercanvas.config(scrollregion=bbox,width=bbox[2])#同时更新宽度
root=Tk()
root.title('窗口测试')
root.grid_rowconfigure(0,权重=1)
总体=帧(根)
整体.grid(行=0,列=0,粘性=N+E+S+W)
总体.grid_rowconfigure(0,权重=1)
outercanvas=画布(总体)
outercanvas.grid(行=0,列=0)
outerFrame=LabelFrame(outercanvas,text='Outer')
outerSB=滚动条(整体,命令=outercanvas.yview)
outercanvas.config(yscrollcommand=outerSB.set)
outerFrame.bind(“”,on_frame_resize)#更改为函数而不是lambda
outercanvas.create_window((0,0),window=outerSframe,anchor=NW)
outerSB.grid(行=0,列=1,粘性=N+E+S)
innercanvas=画布(OuterFrame)
网格(行=0,列=0)
innerSframe=LabelFrame(innercanvas,text='Inner')
innercanvas.create_window((0,0),window=innerSframe,anchor=NW)
标签(innerSframe,text='1234567890012345678901234567890').pack()
root.mainloop()

这是因为您的代码没有指定
外部通道的宽度。您应该根据绑定到
事件的
外部帧
内部回调的宽度设置其宽度:

def on_frame_resize(event):
    bbox = outercanvas.bbox('all')
    outercanvas.config(scrollregion=bbox, width=bbox[2]) # update width as well

root=Tk()
root.title('Window Test')
root.grid_rowconfigure(0,weight=1)

overall=Frame(root)
overall.grid(row=0,column=0,sticky=N+E+S+W)
overall.grid_rowconfigure(0,weight=1)

outercanvas=Canvas(overall)
outercanvas.grid(row=0,column=0)
outerSframe=LabelFrame(outercanvas,text='Outer')
outerSB=Scrollbar(overall,command=outercanvas.yview)
outercanvas.config(yscrollcommand=outerSB.set)
outerSframe.bind('<Configure>', on_frame_resize) # changed to a function instead of lambda
outercanvas.create_window((0,0),window=outerSframe,anchor=NW)
outerSB.grid(row=0,column=1,sticky=N+E+S)

innercanvas=Canvas(outerSframe)
innercanvas.grid(row=0,column=0)
innerSframe=LabelFrame(innercanvas,text='Inner')
innercanvas.create_window((0,0),window=innerSframe,anchor=NW)
Label(innerSframe,text='123456789012345678901234567890').pack()

root.mainloop()
def on_frame_resize(事件):
bbox=outercanvas.bbox('all')
outercanvas.config(scrollregion=bbox,width=bbox[2])#同时更新宽度
root=Tk()
root.title('窗口测试')
root.grid_rowconfigure(0,权重=1)
总体=帧(根)
整体.grid(行=0,列=0,粘性=N+E+S+W)
总体.grid_rowconfigure(0,权重=1)
outercanvas=画布(总体)
outercanvas.grid(行=0,列=0)
outerFrame=LabelFrame(outercanvas,text='Outer')
outerSB=滚动条(整体,命令=outercanvas.yview)
outercanvas.config(yscrollcommand=outerSB.set)
outerFrame.bind(“”,on_frame_resize)#更改为函数而不是lambda
outercanvas.create_window((0,0),window=outerSframe,anchor=NW)
outerSB.grid(行=0,列=1,粘性=N+E+S)
innercanvas=画布(OuterFrame)
网格(行=0,列=0)
innerSframe=LabelFrame(innercanvas,text='Inner')
innercanvas.create_window((0,0),window=innerSframe,anchor=NW)
标签(innerSframe,text='1234567890012345678901234567890').pack()
root.mainloop()

应该
innerSframe
innercanvas
的子对象,而不是
outercanvas
?。是的,现在应该更正。应该
innerSframe
innercanvas
的子对象,而不是
outercanvas
?是的,现在应该更正。