出现包含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'将调用meteory goodness(存根),但能够输入例如“流星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'”(退格)不能普遍起作用......
基本上我不想拥有:
user@computer: python woop.py
# Now displaying a beautiful landscape
(cmd): s
(cmd): se
(cmd): sea
(cmd): seas
...etc
输入一个命令
限制使用:
(尽管其他答案也很受欢迎,因为未来的人们希望解决不同的问题)
答案 0 :(得分:2)
# 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 :(得分:1)
您应该使用cmd [0]框架来构建解释器,并在单独的线程中启动cmd.cmdloop。 0. http://docs.python.org/3/library/cmd.html