Python 使用批处理渲染时,如何从屏幕上删除对象(标签、图形)?

Python 使用批处理渲染时,如何从屏幕上删除对象(标签、图形)?,python,python-3.x,windows,pyglet,Python,Python 3.x,Windows,Pyglet,我正在用Pyglet构建一个演示程序,它使用串行输出读取和更新屏幕上的对象 导入pyglet 将输出解析器作为解析导入 端口=输入(“串行端口”(示例:COM3,/dev/ttyUSB0)) ser=parse.serial.serial(端口=port,波特率=115200) ser.write('exit\r'。encode('utf-8')) #测试正在进行中 伊索彭爵士() #########################################################

我正在用Pyglet构建一个演示程序,它使用串行输出读取和更新屏幕上的对象

导入pyglet 将输出解析器作为解析导入 端口=输入(“串行端口”(示例:COM3,/dev/ttyUSB0)) ser=parse.serial.serial(端口=port,波特率=115200) ser.write('exit\r'。encode('utf-8')) #测试正在进行中 伊索彭爵士() ########################################################## def更新(自我): #这里有些代码用于获取输出和处理数据 # # 如果是posTiles和negTiles: 全球金融词汇 finalcoords=findCoords(poscoords、negcoords、wide) 全球画布 画布[0]。顶点=最终词 如果uid: 全局uid_标签 uid\u label=pyglet.text.label(text=str(uid), font_name='Times New Roman', font_size=24, x=最终单词[0]+宽度, y=最终词汇[5], 颜色=(0,0250255), 批次=批次,组=文本) 其他: 如果画布: 尝试: 画布[0]。顶点=零 uid\u label.delete() 除: 通过 ###################################################### 尝试: config=pyglet.gl.config(双缓冲区=True) window=pyglet.window.window(1280720,resizable=True,config=config) 窗口。设置最小大小(640480) batch=pyglet.graphics.batch() plate=pyglet.graphics.OrderedGroup(0) connect=pyglet.graphics.OrderedGroup(1) text=pyglet.graphics.OrderedGroup(2) 单元格={} 画布={} 单元[0]=单元(x[0],y[0],l,全局_id[0:4]) canvas[0]=batch.add(4,pyglet.gl.gl_四边形,connect,('v2f',zero)) @窗口事件 def on_draw(): window.clear() batch.draw() @窗口事件 def on_deactivate(): 塞尔克洛斯() #push_处理程序(pyglet.window.event.WindowEventLogger()) pyglet.clock.schedule_间隔(更新,1/240) pyglet.app.run()文件 最后: window.close() 塞尔克洛斯()
update()
函数检查串行输出中的更改,并在pyglet窗口中绘制适当的形状。我还希望
update()
函数在串行端口没有实际输出时从屏幕上删除
uid\u标签
。显示程序的工作方式-您可以将画布对象视为白色矩形,将“3004”视为标签

但是,当串行端口没有输出时(没有
posTiles
nectiles
的值),标签对象仍然保留:, 即使我已经在上面调用了
uid\u label.delete()

所以,我的问题是——如何让屏幕上的标签消失
uid\u 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()
操作。精灵也是如此。

事实上,
.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()
操作。精灵也是如此。

当你说代码中没有任何东西可以刷新图形区域时,你的确切意思是什么?我认为这是由
window.clear()
batch.draw()
@FreeSoul94负责的是的,这两个函数就是这么做的。但是默认情况下,Pyglet并不总是调用绘图上的
。您需要触发事件,使Pyglet意识到需要重新绘制场景。计时器可能会起作用,我不太确定,因为我在大多数示例和用例中都使用过计时器,因为它在大多数情况下提供更高的帧速率。它还使我能够使用我更熟悉的OOP。比较起来,我的
render()
函数会被尽可能频繁地调用。在我的完整代码中,我启用了
window.push\u处理程序(pyglet.window.event.WindowEventLogger())
,这让我可以看到事件处理程序如何调用事件,并显示在每次
update()之间至少调用一次
on\u draw()
功能。这告诉我,它应该在每次迭代
update()
后正确刷新,但情况似乎并非如此。这就是为什么我不确定到底出了什么问题,一切似乎都安排妥当了。顺便说一下,非常感谢你的帮助!你说鳕鱼里什么都没有是什么意思