Контекст:
Я пытался сделать что-то вроде преобразования Фурье.Я хотел в значительной степени повторить youtuber «Поезд кодирования» с его программой «Coding Challenge # 125: Fourier Series».Я решил использовать tkinter, потому что понятия не имею, какие библиотеки хороши, и если есть такая, лучше порекомендуйте ее мне.
Проблема:
Я продолжаю получать ошибки каждый раз, когда создаю бесконечный цикл, который заставляет круг двигаться бесконечно вправо.
Код:
Моя первая попытка была следующей:
while True:
canvas.move(circle, 1, 0)
tk.update()
time.sleep(0.2)
Возвращает ошибку после выхода из приложения, хотя и служит по назначению.Я думаю, что, возможно, попробовал еще несколько вещей, но моя самая последняя и отчаянная попытка решить эту ужасно тривиальную проблему была:
async def routine():
while True:
canvas.move(circle, 1, 0)
tk.update()
await asyncio.sleep(0.1)
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(routine())
tk.mainloop()
Резюме:
Эта проблема не касается программспособность бегать, но это очень раздражает, кроме того, я читал в другом месте, что лучше всего использовать основной цикл, но я не знаю почему.Даже учебники YouTube, которые я обнаружил, похоже, даже не признают, что их программа спамит их оболочку.Должен ли я просто игнорировать это или есть правильный способ сделать это?Также, если есть лучший способ рисовать, пожалуйста, поделитесь.edit:
Решение:
В ответ на furas, я решил это, поместив все свои анимации в функцию перемещения.Если в функции перемещения указано, что окружность смещает один пиксель, то функция tk.after () снова вызывает функцию перемещения через столько миллисекунд, сколько мне нужно.Выглядит достаточно красиво и работает без нареканий.Пример кода;
import tkinter
tk = tkinter.Tk()
canvas = tkinter.Canvas(tk)
circle = canvas.create_oval(0, 0, 100, 100)
def move():
canvas.move(circle, 1, 0)
tk.after(100, move)
canvas.pack()
move()
tk.mainloop()