Есть ли способ прекратить получать ошибки с циклами tkinter? - PullRequest
0 голосов
/ 02 мая 2019

Контекст:

Я пытался сделать что-то вроде преобразования Фурье.Я хотел в значительной степени повторить 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()

1 Ответ

0 голосов
/ 02 мая 2019

Это пример использования after() для перемещения по кругу

Функция move() перемещает круг и использует root.after(100, move) для повторного запуска через 100 мс.
Таким образом, функция зацикливается, но не останавливается mainloop. И это не дает ошибки.

import tkinter as tk
import random

def move():
    move_x = random.randint(-5, 5)
    move_y = random.randint(-5, 5)

    canvas.move(circle, move_x, move_y)

    root.after(100, move)

# --- main ---

SIZE = 50
WIDTH = 500
HEIGHT = 500

start_x = random.randint(0, WIDTH-SIZE)
start_y = random.randint(0, HEIGHT-SIZE)

root = tk.Tk()

canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT)
canvas.pack()

circle = canvas.create_oval(start_x, start_y, start_x+SIZE, start_y+SIZE, fill='green')

move()

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