Я строю демонстрационную программу на 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]
появляться и исчезать, но я нашел обходной путь, установив вершины в ноль.Тем не менее, я не могу сделать это с меткой, и в идеале я хотел бы также добавлять и удалять объекты по мере выполнения программы, и мне не нужно хранить их вершины и устанавливать их в ноль, когда мне это нужно.