我一直在尝试进行傅立叶变换。我想用他的“编码挑战#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()
答案 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()