【问题标题】:Scrollbar on Canvas with frame inside画布上的滚动条,里面有框架
【发布时间】:2017-01-18 00:56:21
【问题描述】:

我在画布上有一个滚动条。在画布上,我附有一个框架。滚动条移动框架的内容,但滚动动作并不局限于它无限上下滚动的框架的大小。滚动条上的拇指也是滚动条的整个大小。一旦我能弄清楚如何告诉滚动条滚动区域是什么,我猜这个问题就会得到纠正。

outside_frame = Frame(self.master)
outside_frame.pack(fill=X, padx=20)

vscrollbar = Scrollbar(outside_frame, width = 20,orient=VERTICAL)
vscrollbar.pack(fill=Y,side=RIGHT, expand=FALSE)

canvas_files = Canvas(outside_frame,bd=0,yscrollcommand=vscrollbar.set)
canvas_files.pack(side=LEFT, fill=BOTH, expand=TRUE)
vscrollbar.config(command=canvas_files.yview)

canvas_files.xview_moveto(0)
canvas_files.yview_moveto(0)      


frame_files=Frame(canvas_files)
frame_files_id = canvas_files.create_window(0 ,0, window=frame_files, anchor=NW)

【问题讨论】:

  • stackoverflow上有很多这样的例子。他们都没有帮助吗?

标签: canvas tkinter scrollbar frame


【解决方案1】:

将scrollregion 选项添加到您的画布,例如:

scrollregion=(0,0,500,500)

【讨论】:

  • 这里的问题是帧大小不固定。它是一个自定义文件选择器,其高度取决于文件的数量。我尝试了 canvas_files.configure(scrollregion = canvas_files.bbox("all")) ,它限制了滚动区域但不是正确的值。
  • 我添加了 scrollregion=(0,0,300,1000) 这主要解决了我的问题,但我需要将高度动态设置为会改变的框架高度。
  • 如果您在框架可见后执行scrollregion=canvas.bbox("all"),则滚动区域将与画布中对象的大小完全匹配。这通常通过绑定到内部框架上的<Configure> 事件来完成,因为它甚至会在框架改变大小时触发。
  • @MFerrero199 我看不到您如何在当前代码中将新文件添加到画布上,但如果它是一个函数,请在函数体末尾添加 .bbox("all")。我相信这肯定会让你到达那里!
【解决方案2】:

所以,我唯一能做的就是为每行创建的文件添加 100 到滚动区域。这解决了问题并且滚动条按预期工作。无论我把它放在哪里, bbox('all') 都不起作用。我确信这将是解决问题的“正确”方法,但我正在继续。感谢大家帮助我指出正确的方向。

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2017-12-21
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多