Проблема с удалением элементов в Tkinter canvas - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь выучить 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 голосов
/ 27 октября 2018

Прежде всего, я бы посоветовал вам посмотреть, как используется pack . Вам нужно всего лишь один раз позвонить pack.

Кроме того, использование sleep не будет работать для вас, поскольку tkinter не будет обновлять окно до конца или начала следующего цикла обновления.

Я бы посоветовал вам попробовать вместо этого after. Вы можете найти полезную тему здесь .

Edit:

Чтобы ответить на ваш комментарий. Вам необходимо предоставить обратный вызов для функции after. Именно эта функция вызывается через 5000 мс. Вместо использования 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)

и оно должно работать.

...