我试图使一个框架可滚动,我发现这样做的唯一方法是制作一个可滚动的画布并为其添加一个框架。如果它适用于我,这将工作正常。
我能够创建一个可以正常工作的可滚动画布,但我似乎无法在其中正确添加框架:
self.title = Label(root, text="Brnr", font=("Helvetica", 50), anchor = W, pady = 40, padx = 50)
self.title.pack (anchor = NW)
#creates title widget for title
self.frame = Frame(screen, bd =1)
self.frame.pack(fill = BOTH)
#Creates frame widget under which all other widgets will be kept
self.canvas = Canvas(self.frame, bd=1,scrollregion=(0,0, 1000, 1000), height = 600)
#creates canvas so that screen can be scrollable
self.scrollbar = Scrollbar(self.frame, command=self.canvas.yview)
#creates scrollbar
self.canvas.config(yscrollcommand=self.scrollbar.set)
#connects the scrollbar to the canvas
self.scrollbar.pack(side=RIGHT, fill=Y)
self.canvas.pack(expand=YES, fill=BOTH)
#packs the scrollbar and canvas so that they fill the remainder of the screen
self.frameC = Frame(bg = "red")
self.canvas.create_window(0,0, anchor = NW, window = self.frameC, width = 200, height = 200)
#creates window on the scrollable area to add other widgets
self.frameC.pack()
self.groupRec = LabelFrame(self.frameC, text ="Recommendations:", font=("Helvetica", 20))
self.groupRec.pack()
self.signupButton = Button(self.groupRec, text="Sign Up", width=10)
self.signupButton.pack(side=RIGHT)
#creates button to submit login
这给了我一个可滚动但空的画布,没有出现labelframe /按钮。
答案 0 :(得分:6)
默认情况下,当您向画布添加窗口时,窗口的中心将位于您给出的坐标处。因此,框架的中心将位于0,0,即画布的左上角。您无法看到小部件,因为它们位于画布的边框之外。
解决方案是在anchor="nw"
的调用中包含create_window
,这会将框架的左上角放在画布的左上角。
不要忘记设置画布的滚动区域以匹配框架的大小。最简单的方法是使用命令self.canvas.config(scrollregion=self.canvas.bbox("all"))
。您可能还需要在画布上添加绑定到<Configure>
,以便在用户调整窗口大小时可以调整内部框架的大小。这并不总是必要的,这取决于你想要完成的事情。
这是一个专业提示:调试这样的问题,暂时给你的框架和画布不同的颜色更容易想象正在发生的事情是非常有帮助的。
答案 1 :(得分:4)
不要重新发明轮子。安装Pmw(Python元小部件),假设您正在使用Tkinter,http://pmw.sourceforge.net/并使用Pmw.ScrolledFrame。