【问题标题】:How to display a moving ball trajectory如何显示移动的球轨迹
【发布时间】:2022-08-20 02:45:28
【问题描述】:

我有一个纯色球在 tkinter 画布中移动,使用 move() 和 update() 方法刷新画布。 我想跟踪屏幕上的球轨迹。即 - 球移动到其新位置,但一条线 - 显示其轨迹的一系列点 - 仍保留在屏幕上。 我该怎么做呢? (两张画布,其中一张是透明的??)

  • 您需要做的就是画一条线,就像画圆一样。 tkinter 中没有真正的透明度。如果您设置透明颜色并将其用作背景,则应用程序的一部分将在桌面上不可见。
  • 感谢一百万您的回答。我的问题是,当我更新()时,屏幕刷新,球处于新位置,并且线随着更新()消失了
  • 也许 Kivy 或 PyGame 对此更有意义。 tk.Canvas 在我的经验中一直很慢。你不会注意到一个球,但随着绘制命令的建立,它会开始窒息。

标签: python tkinter


【解决方案1】:

正如建议的那样,您可以绘制从球的最后一个位置开始到当前新球位置结束的线条。

我在 tkinter 中制作了简单的应用程序,您可以根据需要进行修改。 它仅使用一个画布,您只需单击画布即可移动球。鼠标右键单击重置画布和球的位置。

from tkinter import Tk, Canvas, Frame, BOTH


class MovingBall(Frame):
    ball_r = 25
    x, y = 0, 0  # ball last coords

    def __init__(self):
        super().__init__()
        self.ball = None
        self.initUI()

    def initUI(self):
        self.master.title("Moving Ball")
        self.pack(fill=BOTH, expand=1)

        self.canvas = Canvas(self)
        # self.canvas.pack(fill=BOTH, expand=1)

        self.ball = self.paint_ball(self.x, self.y)
        self.canvas.pack(fill=BOTH, expand=1)
        # Left click on canvas moves the ball
        self.canvas.bind("<Button-1>", self.move)
        # Right click on canvas reset ball position
        self.canvas.bind("<Button-3>", self.reset)

    def paint_ball(self, x, y):
        return self.canvas.create_oval(x - self.ball_r, y - self.ball_r, x + self.ball_r, y + self.ball_r, fill="red",
                                       outline="silver", width=1)

    def paint_path(self, x, y):
        return self.canvas.create_line(self.x, self.y, x, y, fill="silver", width=1)

    def move(self, event):
        # Remove last painted ball
        self.canvas.delete(self.ball)
        # Add new line to the path
        self.paint_path(event.x, event.y)
        # Paint new ball at new position
        self.ball = self.paint_ball(event.x, event.y)
        self.canvas.pack(fill=BOTH, expand=1)
        # Store current ball coords
        self.x, self.y = event.x, event.y

    def reset(self, event):
        """Reset whole scene and put ball to 0,0"""
        self.x, self.y = 0, 0
        self.canvas.delete("all")
        self.ball = self.paint_ball(self.x, self.y)
        self.canvas.pack(fill=BOTH, expand=1)


def main():
    root = Tk()
    MovingBall()
    root.geometry("1024x768")
    root.mainloop()


if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多