测试如何将MatPlotLib嵌入到wxPython中

14 篇文章 1 订阅
11 篇文章 1 订阅

测试如何将MatPlotLib嵌入到wxPython中:

# -*- coding: utf-8 -*-
###############################################################################
#  wxMPL_test.pyw
#author: Wu Xuping
#Date : 2013-09-15
#测试如何将MatPlotLib嵌入到wxPython中
###############################################################################
import numpy as np
import wx
import matplotlib

# matplotlib采用WXAgg为后台,将matplotlib嵌入wxPython中
matplotlib.use("WXAgg")
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure
from matplotlib.backends.backend_wx import NavigationToolbar2Wx as NavigationToolbar

######################################################################################
class MPL_Panel(wx.Panel):
    ''' #MPL_Panel面板,可以继承或者创建实例'''
    def __init__(self,parent):  
        wx.Panel.__init__(self,parent=parent, id=-1)  
  
        self.Figure = matplotlib.figure.Figure(figsize=(4,3))  
        self.axes = self.Figure.add_axes([0.1,0.1,0.8,0.8])  
        self.FigureCanvas = FigureCanvas(self,-1,self.Figure)  
          
        #继承鼠标移动显示鼠标处坐标的事件  
        self.FigureCanvas.mpl_connect('motion_notify_event',self.MPLOnMouseMove)  
          
        self.NavigationToolbar = NavigationToolbar(self.FigureCanvas)  
  
        self.StaticText = wx.StaticText(self,-1,label='Show Help String')  
  
        self.SubBoxSizer = wx.BoxSizer(wx.HORIZONTAL)  
        self.SubBoxSizer.Add(self.NavigationToolbar,proportion =0, border = 2,flag = wx.ALL | wx.EXPAND)  
        self.SubBoxSizer.Add(self.StaticText,proportion =-1, border = 2,flag = wx.ALL | wx.EXPAND)  
  
        self.TopBoxSizer = wx.BoxSizer(wx.VERTICAL)  
        self.TopBoxSizer.Add(self.SubBoxSizer,proportion =-1, border = 2,flag = wx.ALL | wx.EXPAND)  
        self.TopBoxSizer.Add(self.FigureCanvas,proportion =-10, border = 2,flag = wx.ALL | wx.EXPAND)  
  
        self.SetSizer(self.TopBoxSizer)  
  
    #显示坐标值      
    def MPLOnMouseMove(self,event):  
  
        ex=event.xdata#这个数据类型是numpy.float64  
        ey=event.ydata#这个数据类型是numpy.float64  
        if ex  and ey :  
            #可以将numpy.float64类型转化为float类型,否则格式字符串可能会出错  
            self.StaticText.SetLabel('%10.5f,%10.5f' % (float(ex),float(ey)))  
            #也可以这样  
            #self.StaticText.SetLabel('%s,%s' % (ex,ey))         

###############################################################################
#  MPL_Frame添加了MPL_Panel的1个实例
###############################################################################
class MPL_Frame(wx.Frame):
    """MPL_Frame可以继承,并可修改,或者直接使用"""
    def __init__(self,title="MPL_Frame Example In wxPython",size=(800,500)):
        wx.Frame.__init__(self,parent=None,title = title,size=size)

        self.MPL = MPL_Panel(self)
        self.Figure = self.MPL.Figure
        self.axes = self.MPL.axes
        self.FigureCanvas = self.MPL.FigureCanvas
        
        self.RightPanel = wx.Panel(self,-1)
        #测试按钮1
        self.Button1 = wx.Button(self.RightPanel,-1,"TestButton",size=(100,40),pos=(10,10))
        self.Button1.Bind(wx.EVT_BUTTON,self.Button1Event)
        #创建FlexGridSizer
        self.FlexGridSizer=wx.FlexGridSizer( rows=5, cols=1, vgap=5,hgap=5)
        self.FlexGridSizer.SetFlexibleDirection(wx.BOTH)
        #加入Sizer中
        self.FlexGridSizer.Add(self.Button1,proportion =0, border = 5,flag = wx.ALL | wx.EXPAND)


        self.RightPanel.SetSizer(self.FlexGridSizer)
        
        self.BoxSizer=wx.BoxSizer(wx.HORIZONTAL)
        self.BoxSizer.Add(self.MPL,proportion =-10, border = 2,flag = wx.ALL | wx.EXPAND)
        self.BoxSizer.Add(self.RightPanel,proportion =0, border = 2,flag = wx.ALL | wx.EXPAND)
    
        self.SetSizer(self.BoxSizer)	
        #MPL_Frame界面居中显示
        self.Centre(wx.BOTH)

    #按钮事件,用于测试绘图
    def Button1Event(self,event):
        x=np.arange(-10,10,0.25)
        y=np.cos(x)
        self.axes.plot(x,y,'--b*')
        self.axes.grid(True)
        self.FigureCanvas.draw()#一定要实时更新
        
       

########################################################################

#主程序测试
if __name__ == '__main__':
    app = wx.PySimpleApp()
    #frame = MPL2_Frame()
    frame =MPL_Frame()
    frame.Center()
    frame.Show()
    app.MainLoop()

图像如下:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用PySimpleGUI的Canvas元素来实现Matplotlib嵌入到PySimpleGUI的界面。 以下是一个示例代码,演示了如何将Matplotlib表绘制在PySimpleGUI的Canvas元素: ```python import PySimpleGUI as sg import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 创建一个Matplotlib表 fig, ax = plt.subplots() ax.plot([1, 2, 3], [4, 5, 6]) # 将表转换为Tkinter的Canvas元素 canvas = FigureCanvasTkAgg(fig, master=window) # 创建一个PySimpleGUI窗口,包含Canvas元素 layout = [[sg.Canvas(key='canvas')]] window = sg.Window('Matplotlib in PySimpleGUI', layout, finalize=True) # 获取Canvas元素的Tkinter对象,以便在之后使用 canvas_elem = window['canvas'].TKCanvas # 在PySimpleGUI窗口显示Matplotlib表 canvas.get_tk_widget().pack(side='top', fill='both', expand=1) # 进入PySimpleGUI事件循环 while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break # 关闭Matplotlib表 plt.close(fig) # 关闭PySimpleGUI窗口 window.close() ``` 在上面的代码,我们首先创建了一个Matplotlib表,然后将它转换为Tkinter的Canvas元素。接着,我们创建了一个PySimpleGUI窗口,包含了一个Canvas元素,并将Matplotlib的Canvas元素添加到了PySimpleGUI的Canvas元素。最后,我们进入了PySimpleGUI的事件循环,等待用户关闭窗口。 需要注意的是,在PySimpleGUI的事件循环,我们需要添加一个判断,以便在用户关闭窗口时关闭Matplotlib表。这是因为Matplotlib表是一个独立的窗口,如果不手动关闭,它将一直存在,直到我们关闭Python解释器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值