Tkinter画布闪烁

时间:2016-12-23 23:26:03

标签: python tkinter

我正在尝试使用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()

关于是什么导致它的任何想法?

1 个答案:

答案 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:

gui example

我认为这是实施完整乒乓游戏的良好起点。