【问题标题】:why does my window doesn't work for on_draw?为什么我的窗口不适用于 on_draw?
【发布时间】:2020-07-13 12:15:13
【问题描述】:

我正在看一个关于 pyglet 的视频,我试图创建一个三角形:

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'

知道如何解决这个问题吗?

【问题讨论】:

    标签: python opengl pyglet opengl-compat


    【解决方案1】:

    on_draw 必须是 mywindow 类的方法而不是函数。不要自己调用on_draw,因为它会在需要更新窗口时自动调用。
    on_draw 的开头,您必须清除显示(参见Windowing)。
    OpenGL 立即模式glBegin/glEnd 序列必须以glEnd 结束。 primitive 类型是 GL_TRIANGLES 而不是 GL_TRIANGLE。如果要在 [0, 255] 范围内指定颜色,则必须使用 glColor3ub(无符号字节)而不是 glColor3b(有符号字节)。
    您必须在on_resize 事件中通过glViewport 设置可调整大小窗口的视口矩形。

    看例子:

    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()
    

    【讨论】:

      【解决方案2】:
      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()
      

      输出:

      【讨论】:

      • 谢谢,但我不是在搜索工作代码。我试图了解我做错了什么。
      猜你喜欢
      • 1970-01-01
      • 2010-09-16
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多