簡體   English   中英

如何顯示移動的球軌跡

[英]How to display a moving ball trajectory

我有一個純色球在 tkinter canvas 中移動,使用 move() 和 update() 方法刷新 canvas。 我想跟蹤屏幕上的球軌跡。 即 - 球移動到它的新 position 但一條線 - 顯示其軌跡的一系列點 - 仍然在屏幕上。 我該怎么做呢? (兩張畫布,其中一張是透明的??)

正如建議的那樣,您可以繪制從球的最后一個 position 開始並以當前新球 position 結束的線條。

我在 tkinter 中制作了簡單的應用程序,您可以根據需要進行修改。 它僅使用一個 canvas,您只需單擊 canvas 即可移動球。 鼠標右鍵單擊重置 canvas 和球 position。

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.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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM