我正在尝试通过编写虚拟相机来学习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()
答案 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)
它应该可以工作。