我开发了一个基于Python的绘图程序,
Whyteboard
我添加了一个新的功能,移动或调整画布边缘附近的点的大小将自动滚动画布。我认为这是一个好主意,在程序的可用性方面,当其他程序没有这个功能时,我很恼火。
def find_edges(self):
"""A line."""
self.edges = {EDGE_TOP: min(self.y, self.y2), EDGE_RIGHT: max(self.x, self.x2),
EDGE_BOTTOM: max(self.y, self.y2), EDGE_LEFT: min(self. x, self.x2)}
def find_edges(self):
"""An image"""
self.edges = {EDGE_TOP: self.y, EDGE_RIGHT: self.x + self.image.GetWidth(),
EDGE_BOTTOM: self.y + self.image.GetWidth(), EDGE_LEFT: self.x}
def find_edges(self):
"""Get the bounding rectangle for the polygon"""
xmin = min(x for x, y in self.points)
ymin = min(y for x, y in self.points)
xmax = max(x for x, y in self.points)
ymax = max(y for x, y in self.points)
self.edges = {EDGE_TOP: ymin, EDGE_RIGHT: xmax, EDGE_BOTTOM: ymax, EDGE_LEFT: xmin}
def check_canvas_scroll(self, x, y, moving=False):
"""
We check that the x/y coords are within 50px from the edge of the canvas
and scroll the canvas accordingly. If the shape is being moved, we need
to check specific edges of the shape (e.g. left/right side of rectangle)
"""
size = self.board.GetClientSizeTuple()
if not self.board.area > size:
return
start = self.board.GetViewStart()
scroll = (-1, -1)
if moving:
if self.shape.edges[EDGE_RIGHT] > start[0] + size[0] - 50:
scroll = (start[0] + 5, -1)
if self.shape.edges[EDGE_BOTTOM] > start[1] + size[1] - 50:
scroll = (-1, start[1] + 5)
else:
if x > start[0] + size[0] - 50:
scroll = (start[0] + 5, -1)
if y > start[1] + size[1] - 50:
scroll = (-1, start[1] + 5)
self.board.Scroll(*scroll)
这个代码实际上运行得很好。如果我们要移动一个形状,那么我们需要知道它的边缘,以便计算它们何时接近画布边缘。如果我们只调整一个点的大小,那么我们只需要使用该点的x/y坐标来查看它是否靠近边缘。
我遇到的问题有点难以描述-基本上,如果你向左移动一个形状,然后停止移动它,如果你将形状定位在画布的50px范围内,那么下次你移动形状时,会触发“好的,这个形状接近结尾了吗?”的代码,画布会向左滚动,即使你把形状移到右边。
youtube video
来证明这个问题。大约在0:54,我把一个多边形移到画布的左边,然后把它放在那里。下次我移动它时,画布会向左滚动,即使我正在向右移动它
另一件事我想补充,但我卡住了是滚动的势头越长的形状滚动?所以,使用大画布,你不会移动一个形状很久,每次移动5像素,当你需要覆盖2000像素的距离时。有什么建议吗?
谢谢大家-抱歉问了这么长的问题!