2011-01-13 3 views
1

Я пытаюсь создать всплывающее меню с правой кнопкой мыши в программе Python (v2.7), используя GLUT. Для этого я не нашел документацию, специфичную для Python, поэтому я использовал документацию на C++, которая обычно почти аналогична.Создание всплывающего меню GLUT в Python-OpenGL

Вот что у меня есть:

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

А вот функции, которые создают меню:

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 

меню получает отображается правильно, но когда я нажимаю на элемент, я получаю это ошибка:

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 

Есть ли у python-opengl другой способ сделать это? Что я здесь делаю неправильно?

Спасибо.

ответ

0

Задание функций обратного вызова через ctypes в Python не работает так, как вы ожидаете. Вы должны использовать CFUNCTYPE для создания функции обратного вызова и использовать результирующую переменную в качестве параметра glutCreateMenu.

Вы найдете более подробную информацию о ctypes и функциях обратного вызова здесь: http://docs.python.org/release/2.5.2/lib/ctypes-callback-functions.html

1

К сожалению, способ, которым PyOpenGL определил функцию обратного вызова, он ожидает ИНТ в качестве возвращаемого типа, а не ничтожный. Ниже приведена обновленная версия функции обратного вызова CreateMenu, которая должна работать.

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 
Смежные вопросы