Найти - Пользователи
Полная версия: OpenGL + wx
Начало » GUI » OpenGL + wx
1
Levelup
Здравствуйте,

Необходимо расположить в одном окне wx.frame одновременно онко opengl (GLCanvas) и несколько элементов wx (кнопки).
Подскажите, пожалуйста, каким образом лучше это реализовать? Наложить opengl на wx.Panel не выходит.
Заранее спасибо.
Levelup
Нашел реализацию на С++ (http://wiki.wxwidgets.org/WxGLCanvas), не поможете на питоне подомным образом сделать.

wxGLCanvas on a wxPanel

No matter what I tried I could not get the wxGLCanvas to work as child of a wxPanel. My goal was to have the same base class for all my visualization classes (2D variants are derived from a wxPanel). As such I wanted the wxGLCanvas to cover the entire wxPanel surface area.

The inheritance scheme is as follows: wxPanel <- PlotBase <- PlotBaseGL

PlotBaseGL would create a wxGLCanvas on top of the wxPanel. After having tried various methods I finally found one that works:
void PlotBaseGL::SetCanvas( void )
{
delete canvas;

int attributelist = { WX_GL_RGBA ,
WX_GL_BUFFER_SIZE ,
_colordepth ,
0 ,
0 };

if ( GetDoubleBuffering() ) attributelist = WX_GL_DOUBLEBUFFER;

Show( false );
canvas = new wxGLCanvas( this, -1, GetPosition(), GetSize(),
GetWindowStyleFlag(), _T(“GLCanvas”),
attributelist, wxNullPalette );

canvas->Reparent( pwindow );
canvas->SetCurrent();
canvas->Show( true );

/* some other setup code here */
PooH
Вы демку wxPython с офсайта скачайте, там есть пример работы с OpenGL из него.
Levelup
Да, я её видел. Но дело в том, что, когда я добавляю opengl в wx.frame, он занимает всю область окна и не получается добавить кнопки.
PooH
Levelup
Да, я её видел. Но дело в том, что, когда я добавляю opengl в wx.frame, он занимает всю область окна и не получается добавить кнопки.
А вы добавьте во Frame сайзер и панель с кнопками, и opengl канвас в сайзер тоже. Вот здесь я примерчик на базе демки накидал.
http://pastebin.com/Y0uBcE1t
Levelup
Спасибо большое! Вспомнил, кстати, что в демо можно включить пример с сайзерами..
leonid_10
Levelup
Спасибо большое! Вспомнил, кстати, что в демо можно включить пример с сайзерами..
Я не так давно взялся изучать wx. Чем он мне нравится, так это возможностью забыть о том, что такое сайзеры. Вот попробовал переделать пример из демо-wxPython - GL без сайзеров с кнопкой:
 # coding:UTF-8
import wx
import sys
from wx import glcanvas
from OpenGL.GL import *
from OpenGL.GLUT import *

class MyCanvasBase(glcanvas.GLCanvas):
def __init__(self, parent):
glcanvas.GLCanvas.__init__(self, parent, -1)
self.init = False
# initial mouse position
self.lastx = self.x = 30
self.lasty = self.y = 30
self.size = None
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseDown)
self.Bind(wx.EVT_LEFT_UP, self.OnMouseUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMotion)

def OnEraseBackground(self, event):
pass # Do nothing, to avoid flashing on MSW.

def OnSize(self, event):
size = self.size = self.GetClientSize()
if self.GetContext():
self.SetCurrent()
glViewport(0, 0, size.width, size.height)
event.Skip()

def OnPaint(self, event):
dc = wx.PaintDC(self)
self.SetCurrent()
self.OnDraw()

def OnMouseDown(self, evt):
self.CaptureMouse()
self.x, self.y = self.lastx, self.lasty = evt.GetPosition()

def OnMouseUp(self, evt):
self.ReleaseMouse()

def OnMouseMotion(self, evt):
if evt.Dragging() and evt.LeftIsDown():
self.lastx, self.lasty = self.x, self.y
self.x, self.y = evt.GetPosition()
self.Refresh(False)

def InitGL(self):
glMatrixMode(GL_PROJECTION)
glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0)
glMatrixMode(GL_MODELVIEW)
glTranslatef(0.0, 0.0, -2.0)
glRotatef(self.y, 1.0, 0.0, 0.0)
glRotatef(self.x, 0.0, 1.0, 0.0)
glEnable(GL_DEPTH_TEST)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)

def OnDraw(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glBegin(GL_QUADS)
glNormal3f( 0.0, 0.0, 1.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f(-0.5, 0.5, 0.5)
glVertex3f(-0.5,-0.5, 0.5)
glVertex3f( 0.5,-0.5, 0.5)
glNormal3f( 0.0, 0.0,-1.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f(-0.5, 0.5,-0.5)
glVertex3f( 0.5, 0.5,-0.5)
glVertex3f( 0.5,-0.5,-0.5)
glNormal3f( 0.0, 1.0, 0.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f( 0.5, 0.5,-0.5)
glVertex3f(-0.5, 0.5,-0.5)
glVertex3f(-0.5, 0.5, 0.5)
glNormal3f( 0.0,-1.0, 0.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f( 0.5,-0.5,-0.5)
glVertex3f( 0.5,-0.5, 0.5)
glVertex3f(-0.5,-0.5, 0.5)
glNormal3f( 1.0, 0.0, 0.0)
glVertex3f( 0.5, 0.5, 0.5)
glVertex3f( 0.5,-0.5, 0.5)
glVertex3f( 0.5,-0.5,-0.5)
glVertex3f( 0.5, 0.5,-0.5)
glNormal3f(-1.0, 0.0, 0.0)
glVertex3f(-0.5,-0.5,-0.5)
glVertex3f(-0.5,-0.5, 0.5)
glVertex3f(-0.5, 0.5, 0.5)
glVertex3f(-0.5, 0.5,-0.5)
glEnd()

self.size = self.GetClientSize()
w, h = self.size
w = max(w, 1.0)
h = max(h, 1.0)
xScale = 180.0 / w
yScale = 180.0 / h
glRotatef((self.y - self.lasty) * yScale, 1.0, 0.0, 0.0);
glRotatef((self.x - self.lastx) * xScale, 0.0, 1.0, 0.0);
self.SwapBuffers()

class myframe(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, "Каир", size=(500,400))
self.panel1 = wx.Panel(self,-1, pos=(0,0), size=(400,400))
self.panel2 = wx.Panel(self,-1, pos=(400,0), size=(100,400))
self.map = MyCanvasBase(self.panel1)
self.map.SetSize((400,400))
self.btn = wx.Button(self.panel2,-1,'Привет!',pos=(5,5),size=(80,40))
def OnButton(self, evt):
pass

app = wx.App()
f = myframe()
f.Show()
app.MainLoop()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB