вводить избыток пиопенгл - PullRequest
2 голосов
/ 25 ноября 2011

После появления окна, содержащего графику GLUT, я хотел бы ввести ввод в терминале:

user@computer: python woop.py
# Now displaying a beautiful landscape
(cmd): season winter
# Now changing season to winter
(cmd): event meteor
# Now meteoring otherwise peaceful landscape
(cmd): season summer
# Now changing season to summer
(cmd): exit
#bye ^_^
user@computer:

В идеале я хотел бы интегрировать python cmd с GLUT glutKeyboardFunc.Мои попытки не увенчались успехом (допускает одно или другое одновременно, но не оба. Также проблемы с фокусировкой у окна или терминала).

Вот пример кода, который отображает вращающийся чайник.В настоящее время нажатие 'm' вызовет совершенство метеорита (заглушка), но возможность ввести, например, "метеор 500" будет предпочтительнее.

#! /usr/bin/env python
''' 
Code is a reduced version of http://www.seethroughskin.com/blog/?p=771
'''
import OpenGL 
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

import time, sys

class dizzyTea:

    global rotY

    def __init__(self):
        self.main()

    def InitGL(self,Width, Height):
        glClearColor(0.0, 0.0, 0.0, 0.0)
        glClearDepth(1.0)
        glShadeModel(GL_SMOOTH)  
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()       
        gluPerspective(45.0, float(Width)/float(Height), 0.1, 100.0)
        glMatrixMode(GL_MODELVIEW)     

    # The main drawing function. 
    def DrawGLScene(self):
        global rotY
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()                    # Reset The View 
        glTranslatef(-0.5, 0.0, -6.0)
        glRotatef(rotY,0.0,1.0,0.0)
        glutWireTeapot(1.0)
        glScalef(0.3,0.3,0.3)
        glutSwapBuffers()
        rotY += 1.0

    # The function called whenever a key is pressed. Note the use of Python tuples to pass in: (key, x, y)  
    def keyPressed(self,*args):

        # If escape is pressed, kill everything.
        if args[0] == '\x1b':
            sys.exit()
        elif args[0] == 'm':
            print "Now meteoring otherwise peaceful teapot"
            # meteor shenanigans

    def main(self):
        global window
        global rotY
        glutInit(sys.argv)
        glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
        glutInitWindowSize(640, 480)
        glutInitWindowPosition(0, 0)
        window = glutCreateWindow("Jeff Molofee's desecrated GL Code Tutorial")
        glutDisplayFunc(self.DrawGLScene)
        glutIdleFunc(self.DrawGLScene)
        glutKeyboardFunc(self.keyPressed)
        self.InitGL(800, 600)
        rotY = 0.0
        glutMainLoop()

if __name__ == "__main__":
    x = dizzyTea()

Я могу собирать символы в глобальныестрока с использованием glutKeyboardFunc , обеспечивающая такой же функциональный эффект, однако пользователь будет печатать вслепую.«print somestring» позволяет печатать в одной строке, однако запятая означает, что вывод не отображается во время набора текста.Также «print '\ b'» (backspace) не работает универсально ...

в принципе я не хочу иметь:

user@computer: python woop.py
# Now displaying a beautiful landscape
(cmd): s
(cmd): se
(cmd): sea
(cmd): seas
...etc

для ввода одной команды

Ограничение использования:

  • pyopengl
  • GLUT

(Хотя другие ответы приветствуются для своенравных будущих людей, которые хотят решить другоепроблема)

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011
# The function called whenever a key is pressed. Note the use of Python tuples to pass in: (key, x, y)  
def keyPressed(self,*args):
    if args[0] == '\x08':
        self.keyCache = self.keyCache[:-1]
    elif args[0] == '\x1b':
        sys.exit()
    elif args[0] == 'm':
        print "Now meteoring otherwise peaceful teapot"
        # meteor shenanigans
    else:
        self.keyCache += args[0]
    sys.stdout.write(self.keyCache +"                                                  \r")#print "keypress: <",self.keyCache,">"
    sys.stdout.flush()

И добавьте новую переменную класса 'keyCache'.

Затем просто используйте обычную очистку печати, чтобы записать данные в одну и ту же строку. Единственный хакерский момент заключается в том, что после кэшированных нажатий клавиш вы должны написать несколько пробелов, в противном случае при использовании возврата на место удаленные элементы все равно будут отображаться на экране.

Другой альтернативой может быть параллельная клавиатурная нить просто для обработки нажатий клавиш из командной строки. Большая проблема заключается в том, что перенасыщение не обеспечивает приятного обратного вызова, когда окно закрывается, поэтому вам нужно найти альтернативный способ уничтожить ваш поток.

1 голос
/ 03 июля 2013

вы должны использовать среду cmd [0] для создания вашего интерпретатора и запустить cmd.cmdloop в отдельном потоке. 0. http://docs.python.org/3/library/cmd.html

...