有没有办法停止通过tkinter循环出错?

时间:2019-05-02 05:51:14

标签: python tkinter

上下文:

我一直在尝试进行傅立叶变换。我想用他的“编码挑战#125:傅里叶级数”程序复制youtuber的“编码火车”。我决定使用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()

摘要:

此问题不会影响程序的运行能力,但会令人烦恼,此外,我在其他地方读到,最好使用mainloop,但我不知道为什么。甚至我发现的youtube教程似乎都没有意识到他们的程序正在向其外壳发送垃圾邮件。我应该忽略它还是有适当的方法来做到这一点?另外,如果有更好的绘画方法,请分享。 编辑:

解决方案:

对于每个问题,我通过将所有动画放入move函数来解决。在move函数中,圆被告知要移动一个像素,然后tk.after()函数在我想要多少毫秒后再次调用move函数。它看起来足够好并且可以毫无抱怨地工作。 示例代码;

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 :(得分:0)

这是示例如何使用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()