我的目的是在GTK +窗口中绘制一些3d对象。我发现OpenGL最适合我的目的。所以,我正在使用GTK +和pyopenGL。
这是我目前的状态,只能画一个GtkGlArea:
import gi
import sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio, Gdk
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
class GridWindow(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.Window.__init__(self, application = app,
default_width=1000,
default_height=200,
border_width=2,
name = "MyWindow")
# Main drawing area
self.area = DrawArea()
self.area.set_size_request(1000,800)
# To attach everything
grid = Gtk.Grid()
grid.attach(self.area,1,0,1,1)
self.add(grid)
class DrawArea(Gtk.GLArea):
def __init__(self):
Gtk.GLArea.__init__(self)
self.connect("realize", self.on_realize)
self.connect("render", self.render)
glutInit(sys.argv)
glutDisplayFunc(self.render)
return
def on_realize(self, area):
ctx = self.get_context()
ctx.make_current()
err = self.get_error()
if err:
print("The error is {}".format(err))
def render(self, area, ctx):
glClearColor(.7,.70,.70,1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
color = [1.0,0.,0.,1.]
glutSolidSphere(2,20,20)
return True
class draw(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
win = GridWindow(self)
win.show_all()
app = draw()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
没有Glut的电话,这显示了GlArea。但是当我尝试使用Glut绘制球体时,它的投掷错误:
python3 devel.py
Traceback (most recent call last):
File "devel.py", line 54, in do_activate
win = GridWindow(self)
File "devel.py", line 19, in __init__
self.area = DrawArea()
File "devel.py", line 33, in __init__
glutDisplayFunc(self.render)
File "/usr/lib/python3.6/site-packages/OpenGL/GLUT/special.py", line 147, in __call__
contextdata.setValue( self.CONTEXT_DATA_KEY, cCallback )
File "/usr/lib/python3.6/site-packages/OpenGL/contextdata.py", line 58, in setValue
context = getContext( context )
File "/usr/lib/python3.6/site-packages/OpenGL/contextdata.py", line 41, in getContext
"""Attempt to retrieve context when no valid context"""
OpenGL.error.Error: Attempt to retrieve context when no valid context
由于python3 + opengl + gtk3中的资源不多,我有点麻烦。
更新代码在Rabbid76的第一次回复之后:
import gi
import sys
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio, Gdk
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
class GridWindow(Gtk.ApplicationWindow):
def __init__(self, app):
Gtk.Window.__init__(self, application = app,
default_width=1000,
default_height=200,
border_width=2,
name = "MyWindow")
# Main drawing area
self.area = DrawArea()
self.area.set_size_request(1000,800)
# To attach everything
grid = Gtk.Grid()
grid.attach(self.area,1,0,1,1)
self.add(grid)
class DrawArea(Gtk.GLArea):
def __init__(self):
Gtk.GLArea.__init__(self)
self.connect("realize", self.on_realize)
self.connect("render", self.render)
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(600, 800)
glutCreateWindow(b'my OpenGL window')
glutDisplayFunc(self.render)
glutMainLoop()
def on_realize(self, area):
ctx = self.get_context()
ctx.make_current()
err = self.get_error()
if err:
print("The error is {}".format(err))
def render(self):
glClearColor(.7,.70,.70,1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
color = [1.0,0.,0.,1.]
glutSolidSphere(20,20,20)
glutSwapBuffers()
glutPostRedisplay()
return True
class draw(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self)
def do_activate(self):
win = GridWindow(self)
win.show_all()
app = draw()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
答案 0 :(得分:1)
您不能同时使用GTK和GLUT。请参阅How do I use GTK and glut together? 。
如果你想在"过剩"中绘制glutSolidSphere
球体。窗口,然后你必须创建一个带有当前OpenGL上下文的OpenGL窗口。请参阅glutCreateWindow
,glutMainLoop
,glutSwapBuffers
,glutPostRedisplay
:
class DrawArea:
def __init__(self):
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutInitWindowSize(600, 800)
glutCreateWindow(b'my OpenGL window')
glutDisplayFunc(self.render)
glutMainLoop()
def render(self, area, ctx):
.....
glutSwapBuffers()
glutPostRedisplay()