python - 使用批量渲染时如何从屏幕上删除对象(标签、图形)?

标签 python python-3.x windows pyglet

我正在 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”视为标签。

但是,当串口没有输出时( posTilesnegTiles 没有值),标签对象仍然保留: 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/

相关文章:

python - 自写模块中的 __init__.py 是否必要?

windows - FFmpeg drawtext - 无法从文件加载字体

python - 在 Python 中使用 Dataset 模块时没有卡住属性

python-3.x - 在python中创建文件夹作为函数参数

python-3.x - 为什么索引名称总是出现在用pandas 创建的parquet 文件中?

windows - 在输出的第一行停止 FOR/F 命令(Windows 批处理)

php - 我可以使用 header() 来传递查询字符串参数吗?

python - 我如何使用 Python gRPC 处理流消息

python - 有没有简单的方法来检查网站是否有 SSL 证书

python - 用作库的织物不起作用