我正在 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
当串口没有实际输出时,从屏幕上看。 This image显示了程序的工作原理 - 您可以将 Canvas 对象视为白色矩形,并将“3004”视为标签。
但是,当串口没有输出时( posTiles
和 negTiles
没有值),标签对象仍然保留: Image ,
即使我已经打电话uid_label.delete()
就在上面。
所以,我的问题是 - 如何使屏幕上的标签消失? uid_label.delete()
似乎不起作用,因为即使在 window.clear()
之后标签仍然在内存中并显示在屏幕上和batch.draw()
。除非我理解不正确,否则不应在窗口上重新绘制从批处理中删除的对象。
我之前在尝试制作 canvas[0]
时遇到了同样的问题对象出现和消失,但我找到了一种解决方法,将顶点设置为零。但是,我无法使用标签来做到这一点,理想情况下,我还希望在程序运行时添加和删除对象,而不必在需要时存储它们的顶点并将它们设置为零。
最佳答案
实际上,.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()
的顶点对象。 Sprite 也是如此。
关于python - 使用批量渲染时如何从屏幕上删除对象(标签、图形)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852750/