【问题标题】:Tkinter - Canvas scrolling explained - restricted area - fixed viewTkinter - 画布滚动解释 - 限制区域 - 固定视图
【发布时间】:2022-12-05 10:58:05
【问题描述】:
它被带到my attention,你不能限制视图,例如scrollregion = (0,0,0,0) 问题是为什么会这样?由于官方文档表明这应该有效并且不会抛出 badRegion 错误。
scrollregion:
指定一个包含四个坐标的列表,分别描述左侧、顶部、
矩形区域的右侧和底部坐标。这个区域是
用于滚动目的,被认为是边界
画布中的信息。每个坐标可能是
在下面的坐标部分给出的任何形式中指定。
scan dragto:
此命令计算其 x 和 y 参数之间的差异
(通常是鼠标坐标)和 x 和 y 参数
小部件的最后一个扫描标记命令。然后它通过以下方式调整视图
增益乘以坐标差,其中增益默认为 10。
此命令通常与鼠标移动事件相关联
widget,产生高速拖动画布的效果
通过它的窗口。返回值是一个空字符串。
【问题讨论】:
标签:
python
tkinter
canvas
scroll
tk-toolkit
【解决方案1】:
长话短说:确保滚动区域大于画布,否则你的画布将重新居中。见comment in the source code:
需要下面的调用才能使画布重新居中
它是受限的,它的滚动区域比窗口小。
误解是基于错误的假设,即视图可能小于画布本身,而这并没有在文档中直接指出,您将 find a hint in the C-implementation 画布。从CANV_SCAN 调用的CavnasSetOringin 的备注:
如有必要,调整原点以尽可能保持
视图中的画布。变量 left、right 等跟踪如何
很多在它粘住之前,视图的每一侧都有额外的空间
超出滚动区域。如果一侧伸出边缘
滚动区域,调整视图使那一侧回到边缘
scrollregion(但不要移动太多以至于另一边粘住
现在出来)。
所以the basic idea 的可滚动区域和隐式条件是滚动区域大于可见区域,应该如下所示:
sx1 vx1 ix1 ix2 vx2 sx2
| | | | | |
+-------------------------------------------------+
| |
| +--------------------+ |
| | | |
| | +------+ | |
| | | item | | |
| | +------+ | |
| | | |
| | visible area | |
| +--------------------+ |
| |
| scroll region |
+-------------------------------------------------+
然而,核心开发人员决定,无论出于何种原因,当 scrollregion 小于可见区域时它是一个有效区域。我想将 scrollregion 绑定到 '<Configure>' 命令会很方便,而不会出现错误。您还应该知道,所有这些仅适用于 confine=True 的画布:
指定一个布尔值,指示它是否应该
允许将画布的视图设置在由
滚动区域参数。默认为 true,这意味着视图
将被限制在滚动区域内。