Как убрать объекты (метки, графику) с экрана при использовании пакетного рендеринга? - PullRequest
1 голос
/ 25 апреля 2019

Я строю демонстрационную программу на Pyglet, которая использует последовательный вывод для чтения и обновления объектов на экране.

import pyglet
import output_parser as parse

port = input("Serial port ? (examples:COM3, /dev/ttyUSB0) ")
ser = parse.serial.Serial(port=port, baudrate=115200)

ser.write('exit\r'.encode('utf-8'))

# Test is ser working
ser.isOpen()

##########################################################
def update(self):
    #Some code here to obtain output and treat data
    #
    #
    if posTiles and negTiles:
        global finalcoords
        finalcoords = findCoords(poscoords, negcoords, wide)
        global canvas
        canvas[0].vertices = finalcoords
        if uid:
            global uid_label
            uid_label = pyglet.text.Label(text=str(uid),
                                          font_name='Times New Roman',
                                          font_size=24,
                                          x=finalcoords[0]+wide,
                                          y=finalcoords[5],
                                          color=(0,0,250,255),
                                          batch=batch, group=text)
    else:
        if canvas:
            try:
                canvas[0].vertices = zero
                uid_label.delete()
            except:
                pass
######################################################
try:
    config = pyglet.gl.Config(double_buffer=True)
    window = pyglet.window.Window(1280, 720, resizable=True, config=config)

    window.set_minimum_size(640, 480)

    batch = pyglet.graphics.Batch()
    plate = pyglet.graphics.OrderedGroup(0)
    connect = pyglet.graphics.OrderedGroup(1)
    text = pyglet.graphics.OrderedGroup(2)

    cells = {}
    canvas = {}
    cells[0] = Cell(x[0],y[0],l, global_id[0:4])

    canvas[0] = batch.add(4, pyglet.gl.GL_QUADS, connect, ('v2f', zero))

    @window.event
    def on_draw():
        window.clear()
        batch.draw()

    @window.event
    def on_deactivate():
        ser.close()

    #window.push_handlers(pyglet.window.event.WindowEventLogger())

    pyglet.clock.schedule_interval(update, 1/240)

    pyglet.app.run()

finally:
    window.close()
    ser.close()

Функция update() проверяет изменения в последовательном выводе и рисует соответствующие фигуры в окне pyglet.Я также хочу, чтобы функция update() удаляла uid_label с экрана, когда нет реального выхода из последовательного порта. Это изображение показывает, как работает программа - вы можете видеть объект холста в виде белого прямоугольника, а "3004" - в качестве метки.

Однако, если через последовательный порт нет выходных данных (нет значений для posTiles и negTiles), объект метки остается: Изображение , даже если я вызвал uid_label.delete() на нем.

Итак, мой вопрос - как сделать так, чтобы ярлык на экране исчезал?uid_label.delete(), похоже, не работает, поскольку метка все еще находится в памяти и отображается на экране даже после window.clear() и batch.draw().Если я не понимаю это неправильно, объект, который удален из пакета, не должен перерисовываться в окне.

Раньше у меня была такая же проблема, когда я пытался заставить объект canvas[0] появляться и исчезать, но я нашел обходной путь, установив вершины в ноль.Тем не менее, я не могу сделать это с меткой, и в идеале я хотел бы также добавлять и удалять объекты по мере выполнения программы, и мне не нужно хранить их вершины и устанавливать их в ноль, когда мне это нужно.

1 Ответ

0 голосов
/ 29 апреля 2019

На самом деле, .delete() работает. Вот минимальный пример (на основе вашего кода), который делает трюк:

import pyglet

canvas = {}

try:
    config = pyglet.gl.Config(double_buffer=True)
    window = pyglet.window.Window(1280, 720, resizable=True, config=config)
    window.set_minimum_size(640, 480)

    batch = pyglet.graphics.Batch()

    canvas[1] = pyglet.text.Label("Moo", x=10, y=10, batch=batch)

    @window.event
    def on_draw():
        window.clear()
        batch.draw()

    @window.event
    def on_key_press(symbol, modifiers):
        # As soon as a key is pressed, we delete the batch objects (all of them)
        for index in list(canvas):
            canvas[index].delete()
            del(canvas[index])

    pyglet.app.run()

finally:
    window.close()

Нажмите любую клавишу, и ярлык исчезнет.
Одна из проблем, с которой вы, возможно, столкнулись при попытке сделать это, заключается в том, что в вашем коде нет ничего, что действительно обновляло бы графическую область.

Что бы создать иллюзию, что ничего не произошло. Каждый раз, когда вы используете batch.add(...), он вернет объект вершины, в котором вы сделали delete(). То же самое касается спрайтов.

...