在Tkinter画布中删除元素的问题

时间:2018-10-27 16:41:03

标签: python tkinter tkinter-canvas

我正在尝试通过编写虚拟相机来学习tkinter。弹出带有画布的窗口,处理程序正在读取按下的键并调用函数。但是,当我按下与清除画布,编写消息并关闭窗口相关的“ P”按钮时,除了关闭窗口外,什么都没有发生。老实说,我不知道我在做什么错。您能帮我找出为什么我不能清除元素并在这里写吗?

import numpy
import sys
import tkinter
from time import sleep
import math

end = False
STEP = 5
ZOOM = 20
ROTATION = math.pi/15

"""
def zoom(symbol):

def move(vector):

def rotate(direction):

"""
def fin():
    global end
    end = True

def key(event):
    handler = {
        'w': lambda: move([0, 0, -STEP]),
        's': lambda: move([0, 0, STEP]),
        'a': lambda: move([STEP, 0, 0]),
        'd': lambda: move([-STEP, 0, 0]),
        'q': lambda: move([0, -STEP, 0]),
        'e': lambda: move([0, STEP, 0]),
        'r': lambda: zoom(True),
        'f': lambda: zoom(False),
        'y': lambda: rotate(8),
        'h': lambda: rotate(2),
        'g': lambda: rotate(4),
        'j': lambda: rotate(6),
        't': lambda: rotate(1),
        'u': lambda: rotate(3),
        'p': lambda: fin(),
    }.get(event.char)

    if handler:
        handler()
        render()

def render():
    if end:
        canvas.delete("all")
        canvas.create_text(200, 30, fill="white", text="bye bye")
        canvas.pack()
        sleep(2)
        sys.exit('elo')
    canvas.pack()

root = tkinter.Tk()
root.title('Camera')
canvas = tkinter.Canvas(root, width=1024, height=768, bg='black')
canvas.create_line(0, 100, 200, 0, fill="red")
root.bind('<Key>', key)
render()
tkinter.mainloop()

1 个答案:

答案 0 :(得分:0)

首先,我建议您看一下pack的用法。您只需拨打一次pack

另外,使用sleep不能达到您的目的,因为tkinter直到下一个更新循环结束或开始才更新窗口。

我建议您改用after。您可以找到有用的线程here

编辑:

回答您的评论。 您需要为after函数提供回调。在5000 ms之后调用此函数。您可以使用sys.exit而不是使用destroy;有点干净。像这样修改您的代码

def render():
    if end:
        canvas.delete("all")
        canvas.create_text(200, 30, fill="white", text="bye bye")
        root.after(5000, root.destroy)

它应该可以工作。