Tkinter滚动画布组件速度问题

0 投票
1 回答
601 浏览
提问于 2025-04-18 12:08

我现在正在用Tkinter重新制作《Flappy Bird》。我知道这样做不好,下面会解释原因。我的问题是关于管道的,它们的滚动速度和彼此之间的距离。除非我的逻辑有问题,如果我把两个管道分开,然后在它们到达某个点时移动它们,并把它们放在同一个位置,它们之间的间隙应该保持不变。用代码来解释可能更清楚。

from tkinter import *
import random

root = Tk()
root.geometry('430x640')
root.configure(background='turquoise')
canvas = Canvas(root,width=int(435),height=int(645))
canvas.configure(background='turquoise')
canvas.pack()


x, x2 = 400, 700

y = random.randint(0,300)
y2 = random.randint(0,300)

def drawPipe():
    global x,x2,y,y2

    canvas.coords(pipeTop,(x,0,(x+50),y))
    canvas.coords(pipeBottom,(x,640,(x+50),(y+150)))


    canvas.coords(pipeTop2,(x2,0,(x2+50),y2))
    canvas.coords(pipeBottom2,(x2,640,(x2+50),(y2+150)))

    x -= 3
    x2 -= 3
    if x < -46:
        x = 435
        y = random.randint(5,540)


    if x2 <-46:
        x2 = 435
        y2 = random.randint(5,540)

    root.after(1,drawPipe)

pipeTop = canvas.create_rectangle(x,0,(x+50),y,fill='green')
pipeBottom = canvas.create_rectangle(x,640,x+50,y+150,fill='green')

pipeTop2 = canvas.create_rectangle(x2,0,(x2+50),y,fill='green')
pipeBottom2 = canvas.create_rectangle(x2,640,(x2+50),(y2+150),fill='green')
drawPipe()

root.mainloop()

这不是我完整的代码,但这是与绘制和更新管道相关的部分。运行这段代码时,你会看到管道的滚动速度在变化。我不明白这是怎么回事。除了起始位置,管道的所有值都是一样的。这是因为Tkinter使用after方法的方式不够高效吗?我尝试过使用线程,但在使用root.bind时出现了问题(可以查看我之前的问题)。还是说这是逻辑错误?提前感谢任何能帮我解决这个问题的人。


顺便说一下,我意识到我不应该在Tkinter中制作游戏,特别是那种需要同时发生多件事情的游戏。不过,我在学校做这个项目,而我想用的模块(Pygame或Pyglet)不能单独为我下载来制作一个没有实际目的的游戏。如果我能使用其他工具,我可能会选择别的。谢谢你的帮助。

1 个回答

0

使用 after(1,..) 的时候,你会得到 1000FPS(每秒帧数),但其实你并不需要这么高的帧数——用 after(20,...) 就能得到 50 FPS

如果你一直用 after(1,..),你的程序就没有时间去做其他事情——它没法执行所有的 after(),所以你会感觉速度不一样。

after(1,..) 的时候,我甚至连窗口都没法移动。
而且我的电脑CPU变得很热,风扇开始转得更快、更响。

撰写回答