在画布中创建框架

1 投票
2 回答
6818 浏览
提问于 2025-04-16 18:11

我想让一个框架可以滚动,找到的唯一方法就是做一个可以滚动的画布,然后把框架放进去。如果这个方法能用的话,那就太好了。

我能创建一个可以滚动的画布,而且它运行得不错,但我就是不知道怎么把框架正确地放进去:

    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

这样做之后,我得到了一个可以滚动但里面是空的画布,标签框和按钮都没有显示出来。

2 个回答

4

别自己重复造轮子了。如果你在用Tkinter,可以安装Pmw(Python元件库),网址是 http://pmw.sourceforge.net/,然后使用Pmw.ScrolledFrame这个功能。

7

默认情况下,当你在画布上添加一个窗口时,窗口的中心会放在你指定的坐标上。所以,如果你把坐标设为0,0,窗口的中心就会在画布的左上角。这样的话,你的窗口里面的内容就会因为超出画布的边界而看不见。

解决这个问题的方法是在调用create_window的时候加上anchor="nw",这样就能把窗口的左上角放在画布的左上角。

别忘了把画布的滚动区域设置成和你的窗口大小一致。最简单的方法是用命令self.canvas.config(scrollregion=self.canvas.bbox("all"))。你可能还需要在画布上添加一个<Configure>的绑定,这样当用户调整窗口大小的时候,你的内部窗口也能跟着调整。这并不是总需要的,具体要看你想实现什么功能。

这里有个小技巧:在调试这类问题时,给你的窗口和画布临时设置不同的颜色,这样可以更清楚地看到发生了什么。

撰写回答