Tkinter Canvas Динамически Удалить / Анимировать Объект - PullRequest
0 голосов
/ 10 февраля 2019

Есть несколько способов обойти это, но есть ли способ запустить этот код подобным образом?

import time
import tkinter as tk
root = tk.Tk()

...canvas stuff...

class thing():
    def __init__(self, canvas):
        self.id = canvas.create_oval(...)
    def something(self):
        canvas.delete(self.id)
        self.id = canvas.create_oval(...)
        canvas.move(self.id, 10, 0)

t = thing()
while True:
    t.something()
    root.update_idletasks()
    root.update()
    time.sleep(0.01)

Приведенный выше скрипт должен анимировать круг, но это не так.(кстати) Я не ищу способ исправить этот код.

Есть ли способ динамического создания имен объектов (для динамического замещения self.id)?

1 Ответ

0 голосов
/ 11 февраля 2019

Вы должны написать функцию, которая выполняет один кадр вашей анимации.Затем используйте after для запуска этой команды по расписанию.

Вот очень простой пример:

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400)
canvas.pack(fill="both", expand=True)

class thing():
    def __init__(self, canvas):
        self.canvas = canvas
        self.id = canvas.create_oval(10, 10, 20, 20, outline="red", fill="red")

    def animate(self):
        self.canvas.move(self.id, 10, 10)
        self.canvas.after(100, self.animate)

t = thing(canvas)
t.animate()
root.mainloop()

Конечно, вам нужно добавить дополнительный код, чтобы иметь возможность остановитьанимация, или изменить ее, когда объект сталкивается с краем или уходит с экрана, и т. д. Однако это иллюстрирует общий принцип.В animate вы можете добавить любую дополнительную логику, которую вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...