pyglet window.flip () не обновляется - PullRequest
1 голос
/ 25 июня 2019

Я рисую круг и немного текста с помощью пиглета. Я бы хотел, чтобы он обновлялся после ключевого нажатия, но вместо того, чтобы вызывать window.flip () во второй раз, окно просто пусто. Любые предложения приветствуются.

from math import *
from pyglet.gl import *

window = pyglet.window.Window()


def make_circle(x_pos, y_pos, radius, numPoints):
    verts = []

    glMatrixMode(GL_PROJECTION)
    glOrtho(0, 640, 0, 480, -1, 1)
    glMatrixMode(GL_MODELVIEW)

    glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
    glColor3f(1, 1, 0)
    for i in range(numPoints):
        angle = radians(float(i) / numPoints * 360.0)
        x = radius * cos(angle) + x_pos
        y = radius * sin(angle) + y_pos
        verts += [x, y]
    circle = pyglet.graphics.vertex_list(numPoints, ('v2f', verts))
    circle.draw(GL_LINE_LOOP)


def text(x, y, text):
    label = pyglet.text.Label(text, font_size=36,
                              x=x, y=y, anchor_x='left', anchor_y='bottom',
                              color=(255, 123, 255, 255))
    label.draw()


make_circle(5, 5, 100, 10)
text(10, 10, 'Test1')
text(30, 30, 'Text2')

window.flip()
input()

make_circle(5, 5, 22, 10)
text(23, 10, 'This text does not appear')
text(30, 23, 'Neither does this one')
window.flip()
input()

1 Ответ

1 голос
/ 25 июня 2019

Если вы не используете цикл событий по умолчанию, тогда вы должны выполнить шаги цикла событий самостоятельно.Недостаточно позвонить window.flip().
Для чертежа вы должны позвонить pyglet.clock.tick(), чтобы показать, что один кадр прошел и window.dispatch_events() для опроса очереди событий операционной системы на предмет новых событий и вызова подключенных обработчиков событий.
Примечание. Поскольку события отправляются вручную, нет необходимости устанавливать матрицу проекции.

См. Также Отправка событий вручную

Например:

from math import *
from pyglet.gl import *

def make_circle(x_pos, y_pos, radius, numPoints):
    verts = []

    glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
    glColor3f(1, 1, 0)
    for i in range(numPoints):
        angle = radians(float(i) / numPoints * 360.0)
        x = radius * cos(angle) + x_pos
        y = radius * sin(angle) + y_pos
        verts += [x, y]
    circle = pyglet.graphics.vertex_list(numPoints, ('v2f', verts))
    circle.draw(GL_LINE_LOOP)


def text(x, y, text):
    label = pyglet.text.Label(text, font_size=36,
                              x=x, y=y, anchor_x='left', anchor_y='bottom',
                              color=(255, 123, 255, 255))
    label.draw()

window = pyglet.window.Window()
# make OpenGL context current
window.switch_to()

# signify that one frame has passed
pyglet.clock.tick()
# poll the operating system event queue
window.dispatch_events()

make_circle(5, 5, 100, 10)
text(10, 10, 'Test1')
text(30, 30, 'Text2')

# swap buffers
window.flip()

input()

# signify that one frame has passed
pyglet.clock.tick()
# poll the operating system event queue
window.dispatch_events()

make_circle(5, 5, 22, 10)
text(23, 10, 'This text does not appear')
text(30, 23, 'Neither does this one')

# swap buffers
window.flip()

input()
...