【问题标题】:Creating Frame inside a Canvas在画布内创建框架
【发布时间】:2011-05-23 17:33:58
【问题描述】:

我正在尝试使框架可滚动,而我发现这样做的唯一方法是制作可滚动的画布并向其添加框架。如果它对我有用,这会很好用。

我能够创建一个可以正常工作的可滚动画布,但我似乎无法在其中正确添加框架:

    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

这给了我一个可滚动但空的画布,没有任何标签框/按钮出现。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    默认情况下,当您将窗口添加到画布时,窗口的中心将位于您提供的坐标处。因此,框架的中心将位于画布的左上角 0,0。您看不到这些小部件,因为它们位于画布的边界之外。

    解决方案是在对create_window 的调用中包含anchor="nw",这会将框架的左上角放置在画布的左上角。

    不要忘记设置画布的滚动区域以匹配框架的大小。最简单的方法是使用命令self.canvas.config(scrollregion=self.canvas.bbox("all"))。您可能还需要在画布上添加对<Configure> 的绑定,以便在用户调整窗口大小时调整内框的大小。这并不总是必要的,这在一定程度上取决于您要完成的工作。

    这里有一个专业提示:要调试这样的问题,暂时为您的框架和画布提供不同的颜色以更轻松地可视化正在发生的事情非常有帮助。

    【讨论】:

    • 太好了,感谢您的帮助!现在我按照你告诉我的去做(锚定)并没有改变任何东西。一旦我为框架添加了颜色,也没有任何改变。这让我相信它没有正确插入画布?有什么推荐吗?谢谢!
    • 当我在您的问题中使用确切的代码,以及您省略的几行以及我建议的更改时,它运行良好。您确定您问题中的代码正是您使用的是什么?
    • 这很奇怪,所以我将在更新中向您展示我的代码的所有部分
    • @Victor Mota:不,您在代码中引入了许多与您在问题中提出的问题无关的错误。您从 tk.Tk 继承,但您没有将 Tkinter 导入为 tk;您将标题设为“root”的子级,但在该上下文中,root 不存在(父级应为“self”),self.frame 是“screen”的子级,但您没有在任何地方定义“screen”,就在那时,我不再试图让你的代码工作了。
    【解决方案2】:

    不要重新发明轮子。安装 Pmw(Python 元小部件),假设您使用的是 Tkinter,http://pmw.sourceforge.net/ 并使用 Pmw.ScrolledFrame。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2011-06-23
      • 2018-01-16
      • 1970-01-01
      • 2012-02-20
      • 2020-03-17
      • 2021-09-28
      相关资源
      最近更新 更多