почему мое окно не работает для on_draw? - PullRequest
1 голос
/ 13 июля 2020

Я смотрел видео про пиглет и попытался создать треугольник:

import pyglet
from pyglet.gl import *

class mywindow(pyglet.window.Window):
    def __init__(self, *args,**kwargs):
        super().__init__(*args,**kwargs)
        self.set_minimum_size(300,300)
        
window = mywindow(300,300,"deneme", True)

def on_draw():
    glBegin(GL_TRIANGLE)
    glColor3b(255,0,0)
    glVertex2f(-1,0)
    glColor3b(0,255,0)
    glVertex2f(1,0)
    glColor3b(0,0,255)
    glVertex2f(0,1)

window.on_draw()
pyglet.app.run()

    

при запуске этого кода; Я получаю эту ошибку:

AttributeError: 'mywindow' object has no attribute 'on_draw'

Есть идеи, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 13 июля 2020

on_draw должен быть методом класса mywindow, а не функцией. Не вызывайте on_draw самостоятельно, потому что он вызывается автоматически, когда окно необходимо обновить. В начале on_draw вы должны очистить отображение (см. Windowing ). Последовательность glBegin / glEnd в немедленном режиме OpenGL должна заканчиваться glEnd. Тип примитивный - это GL_TRIANGLES, а не GL_TRIANGLE. Если вы хотите указать цвета в диапазоне [0, 255], вы должны использовать glColor3ub (байт без знака), а не glColor3b (байт со знаком). Вы должны установить прямоугольник области просмотра изменяемого размера на glViewport в событии on_resize.

См. Пример:

 import pyglet
from pyglet.gl import *

class mywindow(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.set_minimum_size(300,300)

    def on_draw(self):

        self.clear()

        glBegin(GL_TRIANGLES)
        glColor3ub(255, 0, 0)
        glVertex2f(-1, 0)
        glColor3ub(0, 255, 0)
        glVertex2f(1, 0)
        glColor3ub(0, 0, 255)
        glVertex2f(0, 1)
        glEnd()

    def on_resize(self, width, height):
        glViewport(0, 0, width, height)

window = mywindow(300,300,"deneme", True)
pyglet.app.run()
0 голосов
/ 13 июля 2020
In [1]: from pyglet.gl import *
   ...:
   ...: window = pyglet.window.Window()
   ...:
   ...: vlist = pyglet.graphics.vertex_list(3, ('v2f', [0,0, 400,50, 200,300]))
   ...:
   ...: @window.event
   ...: def on_draw():
   ...:     glClear(pyglet.gl.GL_COLOR_BUFFER_BIT)
   ...:     glColor3f(1,0,0)
   ...:     vlist.draw(GL_TRIANGLES)
   ...:
   ...: pyglet.app.run()

Вывод: введите описание изображения здесь

...