#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2019/11/11 01:57:24 +0900> """ wxPython with pycairo. python - Drawing with cairo in wxpython - Stack Overflow https://stackoverflow.com/questions/23661347/drawing-with-cairo-in-wxpython Windows10 x64 + Python 2.7.17 32bit + wxPython 4.0.7.post1 """ import wx import wx.lib.wxcairo import cairo import random import math import time random_seed = 42 def make_texture(tw, th): surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, tw, th) cr = cairo.Context(surface) # fill BG cr.set_source_rgb(0, 0, 0) cr.rectangle(0, 0, tw, th) cr.fill() random.seed(random_seed) # fill rectangles for i in range(96): w = int(random.uniform(tw * 0.02, tw * 0.25)) h = int(random.uniform(th * 0.02, th * 0.25)) x = random.randint(0 - w, tw - 1) y = random.randint(0 - h, th - 1) r = random.uniform(0.0, 1.0) g = random.uniform(0.0, 1.0) b = random.uniform(0.0, 1.0) a = random.uniform(0.0, 1.0) cr.set_source_rgba(r, g, b, a) cr.rectangle(x, y, w, h) cr.fill() return surface class MyDrawingArea(wx.Panel): def __init__(self, parent): super(MyDrawingArea, self).__init__(parent, wx.ID_ANY, size=(512, 512)) self.w, self.h = 512, 512 self.SetBackgroundColour([64, 64, 64]) self.SetDoubleBuffered(True) self.Bind(wx.EVT_PAINT, self.on_paint) def on_paint(self, e): dc = wx.PaintDC(self) cr = wx.lib.wxcairo.ContextFromDC(dc) # w, h = self.Size.GetWidth(), self.Size.GetHeight() self.surface = make_texture(self.w, self.h) cr.set_source_surface(self.surface, 0, 0) cr.paint() class MyFrame(wx.Frame): def __init__(self, title): super(MyFrame, self).__init__(None, title=title, size=(720, 600)) self.panel = wx.Panel(self) self.btn1 = wx.Button(self.panel, wx.ID_ANY, "Generate") self.btn1.Bind(wx.EVT_BUTTON, self.on_click_generate) self.btn2 = wx.Button(self.panel, wx.ID_ANY, "Redraw") self.btn2.Bind(wx.EVT_BUTTON, self.on_click_redraw) self.darea = MyDrawingArea(self.panel) self.vbox = wx.BoxSizer(wx.VERTICAL) self.vbox.Add(self.btn1, 2) self.vbox.Add(self.btn2, 1) self.hbox = wx.BoxSizer(wx.HORIZONTAL) self.hbox.Add(self.darea, 4, wx.EXPAND | wx.ALL, 8) self.hbox.Add(self.vbox, 1) self.panel.SetSizer(self.hbox) def on_click_generate(self, event): global random_seed random_seed = math.floor(time.time() * 100) self.darea.Refresh() def on_click_redraw(self, event): self.darea.Refresh() def main(): app = wx.App(False) frm = MyFrame("wxPython with pycairo") frm.Show() app.MainLoop() if __name__ == '__main__': main()