wxPython:一曲MFC的挽歌,理想主义的绝唱( 十 )


wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
6.5.内嵌浏览器
wx.html2是wxPython扩展模块中封装得最干净漂亮的模块之一 , 它被设计为允许为每个端口创建多个后端 , 尽管目前只有一个可用 。 它与wx.html.HtmlWindow的不同之处在于 , 每个后端实际上都是一个完整的渲染引擎 , MSW上是Trident,macOS和GTK上是Webkit 。 wx.html2渲染web文档 , 对于HTML、CSS和javascript都可以有很好的支持 。
importwximportwx.html2aswebviewclassMainFrame(wx.Frame):"""桌面程序主窗口类"""def__init__(self):"""构造函数"""wx.Frame.__init__(self,parent=None)self.SetTitle('内嵌浏览器')self.SetIcon(wx.Icon('res/wx.ico',wx.BITMAP_TYPE_ICO))self.SetBackgroundColour((224,224,224))self.SetSize((800,480))self.Center()wv=webview.WebView.New(self)wv.LoadURL('https://cn.bing.com')if__name__=='__main__':app=wx.App()frame=MainFrame()frame.Show()app.MainLoop()代码运行界面如下图所示 。
wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
集成应用
7.1.集成Matplotlib
Matplotlib的后端子模块backends几乎支持所有的GUI库 , wxPyton当然也不例外 , backend_wxagg是专门为wxPyton生成canvas的类 , 只要传一个matplotlib.Figure实例即可 。 剩下的就是水到渠成了 。
importnumpyasnpimportmatplotlibfrommatplotlib.backendsimportbackend_wxaggfrommatplotlib.figureimportFigureimportwxmatplotlib.use('TkAgg')matplotlib.rcParams['font.sans-serif']=['FangSong']matplotlib.rcParams['axes.unicode_minus']=FalseclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""wx.Frame.__init__(self,parent,style=wx.DEFAULT_FRAME_STYLE)self.SetTitle('集成Matplotlib')self.SetIcon(wx.Icon('res/wx.ico'))self.SetBackgroundColour((224,224,224))#设置窗口背景色self.SetSize((800,600))self._init_ui()self.Center()def_init_ui(self):"""初始化界面"""self.fig=Figure()self.canvas=backend_wxagg.FigureCanvasWxAgg(self,-1,self.fig)btn_1=wx.Button(self,-1,'散点图',size=(80,30))btn_2=wx.Button(self,-1,'等值线图',size=(80,30))btn_1.Bind(wx.EVT_BUTTON,self.on_scatter)btn_2.Bind(wx.EVT_BUTTON,self.on_contour)sizer_btn=wx.BoxSizer()sizer_btn.Add(btn_1,0,wx.RIGHT,20)sizer_btn.Add(btn_2,0,wx.LEFT,20)sizer_max=wx.BoxSizer(wx.VERTICAL)sizer_max.Add(self.canvas,1,wx.EXPAND|wx.ALL,10)sizer_max.Add(sizer_btn,0,wx.ALIGN_CENTER|wx.BOTTOM,20)self.SetSizer(sizer_max)self.Layout()defon_scatter(self,evt):"""散点图"""x=np.random.randn(50)#随机生成50个符合标准正态分布的点(x坐标)y=np.random.randn(50)#随机生成50个符合标准正态分布的点(y坐标)color=10*np.random.rand(50)#随即数 , 用于映射颜色area=np.square(30*np.random.rand(50))#随机数表示点的面积self.fig.clear()ax=self.fig.add_subplot(111)ax.scatter(x,y,c=color,s=area,cmap='hsv',marker='o',edgecolor='r',alpha=0.5)self.canvas.draw()defon_contour(self,evt):"""等值线图"""y,x=np.mgrid[-3:3:60j,-4:4:80j]z=(1-y**5+x**5)*np.exp(-x**2-y**2)self.fig.clear()ax=self.fig.add_subplot(111)ax.set_title('有填充的等值线图')c=ax.contourf(x,y,z,levels=8,cmap='jet')self.fig.colorbar(c,ax=ax)self.canvas.draw()if__name__=='__main__':app=wx.App()frame=MainFrame(None)frame.Show()app.MainLoop()代码运行界面如下图所示 。
wxPython:一曲MFC的挽歌,理想主义的绝唱
文章图片
7.2.集成OpenGL
wx.glcanvas.GLCanvas是wxPython为显示OpenGL提供的类 , 顾名思义 , 可以将其理解为OpenGL的画板 。 有了这个画板 , 我们就可以使用OpenGL提供的各种工具在上面绘制各种三维模型了 。 下面的代码仅是一个demo , 并未构建投影系统和视点系统 。
importnumpyasnpfromOpenGL.GLimport*importwxfromwximportglcanvasclassMainFrame(wx.Frame):"""从wx.Frame派生主窗口类"""def__init__(self,parent):"""构造函数"""wx.Frame.__init__(self,parent,style=wx.DEFAULT_FRAME_STYLE)self.canvas=glcanvas.GLCanvas(self,style=glcanvas.WX_GL_RGBA|glcanvas.WX_GL_DOUBLEBUFFER|glcanvas.WX_GL_DEPTH_SIZE)self.context=glcanvas.GLContext(self.canvas)self.csize=self.canvas.GetClientSize()self.SetTitle('集成OpenGL')self.SetIcon(wx.Icon('res/wx.ico'))self.SetBackgroundColour((224,224,224))#设置窗口背景色self.SetSize((800,600))self.Center()sizer_max=wx.BoxSizer()sizer_max.Add(self.canvas,1,wx.EXPAND|wx.ALL,5)self.SetSizer(sizer_max)self.Layout()self.Bind(wx.EVT_SIZE,self.on_resize)self.canvas.SetCurrent(self.context)glClearColor(0,0,0,1)#设置画布背景色self.draw()defon_resize(self,evt):"""窗口改变事件函数"""self.canvas.SetCurrent(self.context)self.csize=self.GetClientSize()self.draw()evt.Skip()defdraw(self):"""绘制"""#清除屏幕及深度缓存glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)#---------------------------------------------------------------glBegin(GL_LINES)#开始绘制线段(坐标轴)#以红色绘制x轴glColor4f(1.0,0.0,0.0,1.0)#设置当前颜色为红色不透明glVertex3f(-0.8,0.0,0.0)#设置x轴顶点(x轴负方向)glVertex3f(0.8,0.0,0.0)#设置x轴顶点(x轴正方向)#以绿色绘制y轴glColor4f(0.0,1.0,0.0,1.0)#设置当前颜色为绿色不透明glVertex3f(0.0,-0.8,0.0)#设置y轴顶点(y轴负方向)glVertex3f(0.0,0.8,0.0)#设置y轴顶点(y轴正方向)#以蓝色绘制z轴glColor4f(0.0,0.0,1.0,1.0)#设置当前颜色为蓝色不透明glVertex3f(0.0,0.0,-0.8)#设置z轴顶点(z轴负方向)glVertex3f(0.0,0.0,0.8)#设置z轴顶点(z轴正方向)glEnd()#结束绘制线段#---------------------------------------------------------------glBegin(GL_TRIANGLES)#开始绘制三角形(z轴负半区)glColor4f(1.0,0.0,0.0,1.0)#设置当前颜色为红色不透明glVertex3f(-0.5,-0.366,-0.5)#设置三角形顶点glColor4f(0.0,1.0,0.0,1.0)#设置当前颜色为绿色不透明glVertex3f(0.5,-0.366,-0.5)#设置三角形顶点glColor4f(0.0,0.0,1.0,1.0)#设置当前颜色为蓝色不透明glVertex3f(0.0,0.5,-0.5)#设置三角形顶点glEnd()#结束绘制三角形#---------------------------------------------------------------glBegin(GL_TRIANGLES)#开始绘制三角形(z轴正半区)glColor4f(1.0,0.0,0.0,1.0)#设置当前颜色为红色不透明glVertex3f(-0.5,0.5,0.5)#设置三角形顶点glColor4f(0.0,1.0,0.0,1.0)#设置当前颜色为绿色不透明glVertex3f(0.5,0.5,0.5)#设置三角形顶点glColor4f(0.0,0.0,1.0,1.0)#设置当前颜色为蓝色不透明glVertex3f(0.0,-0.366,0.5)#设置三角形顶点glEnd()#结束绘制三角形#交换缓冲区self.canvas.SwapBuffers()if__name__=='__main__':app=wx.App()frame=MainFrame(None)frame.Show()app.MainLoop()代码运行界面如下图所示 。