wx_exΒΆ

GR / wxPython interoperability example

../_images/wx_ex.png
import wx
import os
import gr


# get_address = lambda obj_str: obj_str[obj_str.find('0x'): obj_str.find('>', obj_str.find('0x'))]

def get_address(obj_str):
    digits = '0123456789abcdef'
    obj_str = obj_str.lower()
    pos = obj_str.find('0x') + 2
    if pos >= 0:
        tmp_string = '0x'
        while pos < len(obj_str) and obj_str[pos] in digits:
            tmp_string += obj_str[pos]
            pos += 1
        return int(tmp_string, 16)
    else:
        return None


class GrWidget(wx.Panel):
    def __init__(self, parent, id):
        wx.Panel.__init__(self, parent, id)

        self.bm = None

        self.setupUi()

        os.environ['GKS_WSTYPE'] = "380"
        os.environ['GKS_DOUBLE_BUF'] = "True"

        self.DrawButton.Bind(wx.EVT_BUTTON, self.draw)
        self.QuitButton.Bind(wx.EVT_BUTTON, self.quit)
        self.Bind(wx.EVT_PAINT, self.paintEvent)

    def setupUi(self):
        self.DrawButton = wx.Button(self, 1, 'Draw')
        self.DrawButton.SetPosition((300, 10))
        self.QuitButton = wx.Button(self, 2, 'Quit')
        self.QuitButton.SetPosition((400, 10))

    def quit(self, event):
        gr.emergencyclosegks()
        self.GetParent().Destroy()

    def draw(self, event):
        self.bm = wx.EmptyBitmap(self.GetSizeTuple()[0], self.GetSizeTuple()[1])
        dc = wx.MemoryDC(self.bm)

        os.environ['GKSconid'] = "%x!%x" % (get_address(repr(self)), get_address(repr(dc)))

        dc.SetBackground(wx.WHITE_BRUSH)
        dc.Clear()

        dc.DrawText("Surface Plot using wxWidgets ...", 15, 15)

        x = range(1, 481)
        y = range(1, 481)
        w, h, d = gr.readimage(
            os.path.join(os.path.dirname(os.path.realpath(__file__)),
                         'surf.png'))
        z = [
            x & 0xff
            for x in d
        ]

        gr.setviewport(0, 1, 0, 1)
        gr.setwindow(1, 480, 1, 480)
        gr.setspace(1, 1000, 30, 80)
        gr.setcolormap(3)
        gr.surface(x, y, z, 6)
        gr.contour(x, y, range(1), z, 0)
        gr.updatews()

        self.Refresh()
        event.Skip()

    def paintEvent(self, ev):
        painter = wx.PaintDC(self)

        if self.bm != None:
            painter.DrawBitmap(self.bm, 0, 0)


class MainFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title=title)
        self.widget = GrWidget(self, -1)
        self.widget.SetSize((500, 500))
        self.Fit()
        self.Centre()


if __name__ == '__main__':
    app = wx.App()

    win = MainFrame(None, -1, title='GRWidget')
    win.Show()

    app.MainLoop()