【问题标题】:How do I delete and create new lines simultaneously如何同时删除和创建新行
【发布时间】:2015-10-14 20:30:25
【问题描述】:

我试图让一条线跟随画布周围的鼠标。到目前为止,我可以创建线条,但我不确定如何删除旧线条,所以屏幕只是充满了黑线。我想删除旧的,但保留鼠标所在的位置。 我的代码是:

def evt_motion(self, e):
        plot = Plotter
        self.set_position(e.x, e.y)
        hstart = (e.x, 0)
        hend = (e.x, 1000)
        vstart = (0, e.y)
        vend = (1000, e.y)
        hor = self.canvas.create_line(hstart, hend)
        ver = self.canvas.create_line(vstart, vend)

【问题讨论】:

  • 一种方法是在旧线上画一条新线,使用背景色。如果您不必担心线路交叉,这将解决问题。
  • 谢谢,但我希望它看起来好像有随鼠标移动的十字准线。
  • 我不知道您使用的是什么平台。你可以声明对象层吗?如果是这样,那么您只需将十字准线放在前层。你的系统有“精灵”的概念吗?十字准线将是一个很好的精灵。否则,您可以简单地删除或覆盖旧图标,然后绘制一个新图标。
  • 经典XY Problem - 你想移动十字准线,你决定通过删除它们并重新绘制它们来做到这一点。相反,您应该使用新位置重新配置对象。

标签: python python-3.x tkinter


【解决方案1】:

当您创建一行时,它会返回一个标识符。您可以使用此标识符来删除该行。例如,如果您的 horver 变量是全局变量,您可以使用它们删除旧行。

例如:

self.canvas.delete(hor)
self.canvas.delete(ver)

您还可以将标签应用于行,这样您就不必跟踪 id。一个标签可以与一个或多个对象相关联。为两行提供相同的标签意味着您可以使用单个命令将它们都删除。

例如:

hor = self.canvas.create_line(hstart, hend, tags=("crosshair",))
ver = self.canvas.create_line(vstart, vend, tags=("crosshair",))
...
self.canvas.delete("crosshair")

但是,无需删除并重新创建该行。您可以简单地修改现有线的坐标。通过给每一行一个唯一的标签,你可以再次使用标签而不是 id。与每次鼠标移动时删除和重新创建行相比,这将显着提高性能。

例如:

hor = self.canvas.create_line(hstart, hend, tags=("hor_line",))
ver = self.canvas.create_line(vstart, vend, tags=("ver_line",))
...
self.canvas.coords("hor_line", e.x, 0, e.x, 1000)
self.canvas.coords("ver_line", 0, e.y, 1000, e.y)

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多