我正在尝试使用Tkinter在Python中实现一个简单的Pong游戏,但不幸的是我遇到了一些闪烁的主要问题。我正在使用一个覆盖整个窗口的Canvas小部件,我每秒钟在画布上绘制矩形很多次。当我这样做时,所有绘制的矩形在游戏运行时会定期闪烁,在再次出现之前消失几分之一秒。
我可以在下面看到我用于绘制游戏的逻辑的一个简单示例,通过运行它,您应该能够看到闪烁的动作:
from tkinter import *
import threading, time
def loop():
FRAME_TIME = 1 / 60
while True:
render()
time.sleep(FRAME_TIME)
def render():
canvas.delete(ALL)
canvas.create_rectangle(0, 0, WIDTH, HEIGHT, fill='black')
WIDTH = 800
HEIGHT = 600
root = Tk()
canvas = Canvas(root, width=800, height=600)
canvas.pack()
threading.Thread(target=loop, daemon=True).start()
root.mainloop()
关于是什么导致它的任何想法?
答案 0 :(得分:1)
您的脚本完全不需要线程(Tkinter
不喜欢线程)。
您应该使用widget.after()
而不是无限的for
循环。
我想您应该定义画布和画布上的矩形,并且在功能中应该移动其他小部件。在这种情况下,您不应删除/重新创建小部件。
黑色的“背景”(矩形)是静态的,并且在脚本运行期间不会更新。在画布(create_oval()
上创建了一个椭圆形的小部件,该小部件在render
函数中移动(在-3和3之间随机更改X-Y位置)。
canvas.after(10, render)
意味着每10秒再次调用一次render
函数。所以实际上这是一个动画,椭圆形将始终在您的画布上移动。
示例:
from tkinter import *
import random
def render():
canvas.move(oval, random.randint(-3, 3), random.randint(-3, 3))
canvas.after(10, render)
WIDTH = 800
HEIGHT = 600
root = Tk()
canvas = Canvas(root, width=800, height=600)
canvas.create_rectangle(0, 0, WIDTH, HEIGHT, fill="black")
oval = canvas.create_oval(400, 400, 410, 410, fill="red")
canvas.pack()
render()
root.mainloop()
GUI:
我认为这是实施完整乒乓游戏的良好起点。