【问题标题】:PyOpenGL: glutTimerFunc callback missing required param 'value'PyOpenGL:glutTimerFunc 回调缺少必需的参数“值”
【发布时间】:2018-09-12 08:55:26
【问题描述】:

使用 PyOpenGL,我正在尝试创建一个简单的三角形,该三角形在每次刷新调用时都会改变颜色,并且我正在尝试使用 glutTimerFunc(...) 来执行此操作。

from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *

import random

def display(value):
    v1 = [-.25,0]
    v2 = [0,.25]
    v3 = [.25, 0]
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(-1,1,-1,1,-1,1)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glBegin(GL_TRIANGLES)

    glColor3b(r,g,b)
    glVertex2f(v1[0], v1[1])
    glVertex2f(v2[0], v2[1])
    glVertex2f(v3[0], v3[1])

    glEnd()
    glFlush()

    glutTimerFunc(1000, display, 5)
    glutPostRedisplay()

if __name__ == '__main__':
    glutInit()
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500,500)
    glutCreateWindow("First Shape")
    glutDisplayFunc(display)
    glutMainLoop()

这是我遇到的错误...

Traceback (most recent call last):
File "_ctypes/callbacks.c", line 232, in 'calling callback function'
TypeError: display() missing 1 required positional argument: 'value'

我尝试传递“值”并将其放在 display() 的参数列表中,但没有成功。

【问题讨论】:

    标签: python python-3.x opengl pyopengl opengl-compat


    【解决方案1】:

    glutDisplayFunc需要的回调函数没有参数,而glutTimerFunc需要的回调函数有on参数。因此,您不能对两者使用相同的功能。
    可能会出现以下情况:

    def timer(value):
        display()
    
    def display()
    
        glutTimerFunc(1000, timer, 5)
    

    但这并不能解决您的问题,因为 glutPostRedisplay将当前窗口标记为需要重新显示,并导致调用glutDisplayFunc设置的显示回调函数。

    如果你想按时间改变颜色,那么创建一个定时器函数,它设置一个新的颜色并重新启动定时器:

    r = 255
    g = 255
    b = 255
    
    def timer(value):
        global r, b, g
        r = random.randint(0,255)
        g = random.randint(0,255)
        b = random.randint(0,255)
        glutTimerFunc(1000, timer, 5)
    

    display函数中移除定时器初始化

    def display():
        global r, b, g
        v1 = [-.25,0]
        v2 = [0,.25]
        v3 = [.25, 0]
        glClear(GL_COLOR_BUFFER_BIT)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        glOrtho(-1,1,-1,1,-1,1)
    
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
    
        glBegin(GL_TRIANGLES)
    
        glColor3b(r,g,b)
        glVertex2f(v1[0], v1[1])
        glVertex2f(v2[0], v2[1])
        glVertex2f(v3[0], v3[1])
    
        glEnd()
        glFlush()
    
        glutPostRedisplay()
    

    但是在启动时调用一次timer函数:

    if __name__ == '__main__':
        glutInit()
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
        glutInitWindowSize(500,500)
        glutCreateWindow("First Shape")
        glutDisplayFunc(display)
        timer(0);
        glutMainLoop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 2018-10-28
      • 2018-12-01
      • 2016-06-29
      • 2018-06-20
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多