wxpython-OGL fails to render objects with Python-3

Frank Miles pedicularis at mail.com
Thu Sep 17 17:18:46 EDT 2020


I have a substantial wxpython-based application that I'm trying to port from python-2 to -3.  
Almost everything is working properly, except for a few small but important sections that use 
the OGL library.  That executes without any exceptions, but the objects created within the 
diagram/canvas/panel are invisible!  {sometimes they are visible for a small fraction of a 
second}.  This occurs on Windows-10 and on Linux(Debian) systems.  The colored background and
buttons render just fine, the buttons do what they should, but no objects appear on the
background (again, only with Py3, Py2 works properly).

I have cut the code to a pretty minimum set and will attempt to paste it to the bottom of 
this message in the hope that it will encourage one of you to see what the problem might be.
Alternatively if anyone knows of an example that works with Python-3 I'd be delighted to 
learn of it.

Thanks for any insights!!

# ---------------------------------------------
#   togl.py     test 'OGL' shape system.

from __future__ import print_function

import  sys
if 2 == sys.version_info.major :
    import wxversion
import  wx
import  random
import  wx.lib.ogl as ogllib

NOMSIZE=80
WINSIZE=400
N_ITEMS=7
shapeTypes= ( 'rect', 'circle', 'rndRect' )

class ShapeGraphicWindow(ogllib.ShapeCanvas):
    def __init__(self, parent):
        ogllib.ShapeCanvas.__init__(self, parent)
        self.diagram= ogllib.Diagram()
        self.SetDiagram(self.diagram)
        self.diagram.SetCanvas(self)
        self.SetBackgroundColour(wx.BLUE)
    def addShape(self, shape_type, title) :
        if 'rect' == shape_type : # rectangle
            shape= ogllib.RectangleShape(50, 35)
            brush= wx.Brush(wx.TheColourDatabase.Find("RED"), wx.SOLID)
        elif 'circle' == shape_type : # circle
            shape= ogllib.CircleShape(65)
            brush= wx.Brush(wx.TheColourDatabase.Find("YELLOW"), wx.SOLID)
        elif 'rndRect' == shape_type : # rounded-rectangle
            shape= ogllib.RectangleShape(45, 30)
            shape.SetCornerRadius(-0.3)
            brush= wx.Brush(wx.TheColourDatabase.Find("GOLDENROD"), wx.SOLID)
        else :
            raise AssertionError("Unable to add shape: %s : %s",(shape_type,title))
        shape.SetBrush( brush )
        x= int(random.uniform(NOMSIZE,WINSIZE-NOMSIZE))
        shape.SetX(x)
        y= int(random.uniform(NOMSIZE,WINSIZE-NOMSIZE))
        shape.SetY(y)
        shape.AddText(title)
        print("Draw",title,"at location ", (x,y), "on canvas of size", self.GetSize())
        shape.SetCanvas(self)
        self.AddShape(shape)
        self.Refresh()
        shape.Show(True)
        return

class TestPanel(wx.Panel):
    def __init__(self, frame) :
        wx.Panel.__init__(self, parent=frame)
        self.objcnts= (0,N_ITEMS)
        sz= wx.BoxSizer(wx.VERTICAL)
        hsz= wx.BoxSizer(wx.HORIZONTAL)
        btnq= wx.Button(self, -1, "Quit")
        btnq.Bind(wx.EVT_BUTTON, self.Quit)
        hsz.Add(btnq, 0, wx.ALL, 3)
        btnq= wx.Button(self, -1, "AutoTest")
        btnq.Bind(wx.EVT_BUTTON, self.AutoTest)
        hsz.Add(btnq, 0, wx.ALL, 3)
        sz.Add(hsz, 0, wx.ALIGN_LEFT)
        self.shp_graph_win= ShapeGraphicWindow(self)
        sz.Add(self.shp_graph_win, 2, wx.EXPAND)
        self.SetSizer(sz)
        #self.Layout()
        #self.Fit()
        self.SetAutoLayout(True)
    def mkTitle(self, index) :
        return ''.join([ chr(index + ord('A')), ":", str(index) ])
    def AutoTest(self, event=None) :
        for j in range(*(self.objcnts)) :
            self.shp_graph_win.addShape(shapeTypes[j % len(shapeTypes)], self.mkTitle(j))
        self.objcnts= (self.objcnts[1], self.objcnts[1]+N_ITEMS)
    def Quit(self, event) :
        self.Destroy()
        sys.exit(0)

class TestFrame(wx.Frame):
    def __init__(self) :
        wx.Frame.__init__(self, None, -1, "test basic OGL functionality",
            size= wx.Size(WINSIZE,WINSIZE) )
        TestPanel(self)
        self.Show(True)

app = wx.App(False)
frame = TestFrame()
ogllib.OGLInitialize()
app.MainLoop()
sys.exit(0)


More information about the Python-list mailing list