如何使用函数在 pyglet 中画线?

How do I use a function to draw a line in pyglet?

我是pyglet的新手,python总的来说,我想创建一个画线的函数。 这是我的代码:

import pyglet
from pyglet import shapes


title = "Tic Tac Toe"

window = pyglet.window.Window(600, 600, title)
batch = pyglet.graphics.Batch()


def drawBoard(batch=None):
    line = shapes.Line(600, 0, 300, 600, width=2, color=(0, 230, 0), batch=batch)
    line.opacity = 250


drawBoard(batch=batch)


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

pyglet.app.run()

当我将函数内的代码移出函数时,它会根据需要创建行,但是当我将它放入函数中时,代码只会创建一个空白背景。

形状 linedrawBoard 函数中的局部变量。 batch 只是存储一个指向形状的弱指针。因此,当函数终止时,line 被销毁。

一个选项是存储行 global 命名空间:

def drawBoard(batch=None):
    global line
    line = shapes.Line(600, 0, 300, 600, width=2, color=(0, 230, 0), batch=batch)
    line.opacity = 250

如果你想画更多的图形,我建议在列表中管理图形:

import pyglet
from pyglet import shapes

title = "Tic Tac Toe"

window = pyglet.window.Window(600, 600, title)
batch = pyglet.graphics.Batch()

def drawBoard(shape_list, batch=None):
    for i in range(100, 600, 100):
        linex = shapes.Line(i, 0, i, 600, width=2, color=(0, 230, 0), batch=batch)
        linex.opacity = 250
        shape_list.append(linex)
        liney = shapes.Line(0, i, 600, i, width=2, color=(0, 230, 0), batch=batch)
        liney.opacity = 250
        shape_list.append(liney)

shape_list = []
drawBoard(shape_list, batch=batch)

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

pyglet.app.run()