python / tkinter屏幕停止显示画布更新

时间:2018-08-25 22:59:40

标签: python tkinter garbage-collection tkinter-canvas mouse-pointer

我有一个程序进行更新(完成完整的图像重新生成,即旋转图像),然后更改tkinter.canvas.image,然后调用canvas.updatestats()强制将更改显示到屏幕上。 time.sleep(0.0001)被调用,过程重复进行。

它可以完美地工作,直到鼠标指针变为一个细小的蓝色圆圈,并且带有一个淡色的圆圈环绕着蓝色圆圈。如果我移动鼠标指针,则圆会相应移动。也许在30秒后,圆圈返回到鼠标指针,并且屏幕在操作30秒后立即变为其外观(此时屏幕对于30秒操作是100%正确的)。但是,在蓝色圆圈出现期间,屏幕不再更新。我怀疑这是因为可能的垃圾收集已启动并导致tkinter正常工作,但屏幕更新已暂停。这需要一段时间才能开始,但随后经常发生。

我尝试导入gc。然后执行gc.disable(),但这没有帮助。

有人知道为什么会这样吗?

有什么方法可以阻止这种情况发生吗?

我的程序可以确定正在停止屏幕更新吗,所以我可以暂停屏幕更新直到完成为止?

1 个答案:

答案 0 :(得分:0)

这是发生问题时正在执行的循环。请记住,代码可以正常工作并产生正确的输出,但是当蓝色圆圈替换鼠标指针时,代码会继续正确执行,只是在30秒的延迟期间屏幕没有更新,并且蓝色圆圈最终消失了显示执行30秒的最终结果。在我的代码中,我不能更改鼠标指针。

这是Windows 10计算机和python 3.6。

    while (fx != tx or fy != ty):
        if fx == tx:
            dx = 0
        elif fx > tx:
            dx = -2 if fx != tx+1 else -1
        else:
            dx =  2 if fx != tx-1 else  1
        if fy == ty:
            dy = 0
        elif fy > ty:
            dy = -2 if fy != ty+1 else -1
        else:
            dy =  2 if fy != ty-1 else  1
        steps += 1
        if steps > 0:
            if sAngle != eAngle:
                if eAngle < sAngle: sAngle -= 2
                else:               sAngle += 2
                im = Image.new("RGBA",(int(tileHeight+tileWidth/2),int(tileHeight+tileWidth/2)))
                if til.direction == North or til.direction == South:
                    im.paste(til.dom.raw[til.direction],(int((tileHeight+tileWidth/2-tileWidth)/2),int(tileWidth/4)))
                else:
                    im.paste(til.dom.raw[til.direction],(int(tileWidth/4),int((tileHeight+tileWidth/2-tileWidth)/2)))
                im = im.rotate(sAngle)
                imm = ImageTk.PhotoImage(im)        
                CANVAS.delete(til.canvasID)
                tags.remove(til.canvasID)
                til.canvasID = CANVAS.create_image(fx,fy,anchor=tk.CENTER,image=imm)
                tags.append(til.canvasID)

        CANVAS.move(til.canvasID,dx,dy)
        fx += dx
        fy += dy
        CANVAS.update_idletasks()
        time.sleep(0.0000001)