Создание всплывающего меню GLUT в Python-OpenGL - PullRequest
2 голосов
/ 13 января 2011

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

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

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 другой способделать это?Что я тут не так делаю?

Спасибо.

Ответы [ 3 ]

1 голос
/ 19 февраля 2012

К сожалению, способ, которым PyOpenGL определил функцию обратного вызова, ожидает int как возвращаемый тип, а не void.Ниже приведена обновленная версия функции обратного вызова 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
0 голосов
/ 31 мая 2019

Этот пример помог мне определить требование для указания параметров типа ctypes для решения той же проблемы. Найден после pyopengl glut документов на glutAddMenuEntry () . Типы данных Ctype для ваших аргументов функций указаны здесь .

Этот фрагмент демонстрирует пример функции f(int)->int, на которую ссылается экземпляр объекта:

class Menu:
 def select_menu(self, choice):
    def _exit():
        import sys
        sys.exit(0)
    {
        1: _exit
    }[choice]()
    glutPostRedisplay()
    return 0

 def create_menu(self):
    # --- Right-click Menu --------
    from ctypes import c_int
    import platform
    #platform specific imports:
    if (platform.system() == 'Windows'):
        #Windows
        from ctypes import WINFUNCTYPE
        CMPFUNCRAW = WINFUNCTYPE(c_int, c_int)
        # first is return type, then arg types.
    else:
        #Linux
        from ctypes import CFUNCTYPE
        CMPFUNCRAW = CFUNCTYPE(c_int, c_int)
        # first is return type, then arg types.

    myfunc = CMPFUNCRAW(self.select_menu)

    selection_menu = glutCreateMenu( myfunc )
    glutAddMenuEntry("Quit", 1);
    glutAttachMenu(GLUT_RIGHT_BUTTON);
    # ---------------------------------
0 голосов
/ 15 января 2011

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

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

...