2011-01-13 3 views
1

Je tente de créer un menu contextuel contextuel dans un programme Python (v2.7) utilisant GLUT. Je n'ai pas trouvé de documentation spécifique à Python pour cela, donc j'ai utilisé la documentation C++, qui est généralement presque similaire.Création d'un menu contextuel GLUT dans Python-OpenGL

Voici ce que j'ai:

if __name__=="__main__": 
    glutInit(sys.argv) 
    #...more initialization code... 
    createMenu() 
    init() 
    glutMainLoop() 

Et voici les fonctions qui créent le menu:

def createMenu(): 
    menu = glutCreateMenu(processMenuEvents) 
    glutAddMenuEntry("One", 1) 
    glutAddMenuEntry("Two", 2) 
    glutAttachMenu(GLUT_RIGHT_BUTTON) 

def processMenuEvents(option): 
    logging.debug("Menu pressed") 
    # not using 'option' right now 

Le menu s'affiche correctement, mais lorsque je clique sur un élément, je reçois ce erreur:

DEBUG:root:Menu pressed: 
Traceback (most recent call last): 
    File "_ctypes/callbacks.c", line 338, in 'converting callback result' 
TypeError: an integer is required 
Exception in <function processMenuEvents at 0x1760b90> ignored 

Est-ce que python-opengl a une manière différente de le faire? Qu'est-ce que je fais mal ici?

Merci.

Répondre

0

La spécification de fonctions de rappel via des types de code en Python ne fonctionne pas comme prévu. Vous devez utiliser CFUNCTYPE pour créer la fonction de rappel et utiliser la variable résultante comme paramètre de glutCreateMenu.

Vous trouverez plus de détails sur ctypes et les fonctions de rappel ici: http://docs.python.org/release/2.5.2/lib/ctypes-callback-functions.html

1

Malheureusement, la façon dont PyOpenGL a défini la fonction de rappel, il attend un int comme type de retour, pas vide. Voici une version mise à jour de votre fonction de rappel CreateMenu qui devrait fonctionner.

def CreateMenu(): 
    menu = glutCreateMenu(processMenuEvents) 
    glutAddMenuEntry("One", 1) 
    glutAddMenuEntry("Two", 2) 
    glutAttachMenu(GLUT_RIGHT_BUTTON) 
    # Add the following line to fix your code 
    return 0 
Questions connexes