一个面板中的选择文件,并在另一个面板中可视化wxpython

时间:2019-03-20 10:21:15

标签: python-3.x wxpython matplotlib-widget

有点复杂,但我会尝试

我有一个面板或一个按钮“ file”,用于选择一个文件,并且此文件的打开是一个.nc文件(netCDF4),所以我想直观地看到它,但我想在其中看到问题另一个面板,就像快速浏览一样,每次您必须选择.nc类型的文件或直接在另一个面板上进行可视化显示时

这是我的2个面板代码的一部分:

class LeftPanelTop(wx.Panel): # panel choose file 
    def __init__(self, parent):
        super().__init__(parent,style = wx.SUNKEN_BORDER)
        self.SetBackgroundColour('snow2')
        List_choices = ["1Km","3Km"]
        List2 = ["3X3","5X5","7X7"]
        self.dateLbl = wx.StaticBox(self, -1, 'Outils ', size=(310, 320))

        self.dategraphSizer = wx.StaticBoxSizer(self.dateLbl, wx.VERTICAL)
        combobox1 = wx.ComboBox(self,choices = List_choices, size =(80,20),pos =(180,50))
        combobox2 = wx.ComboBox(self,choices = List2, size =(80,20),pos =(180,90))
        wx.StaticText(self, label='Referen:', pos=(70, 50))
        wx.StaticText(self, label='pixel:', pos=(70, 90))
        QuickLook = wx.Button(self ,-1, "Open file" , size =(80, 25),pos =(180,130))
        wx.StaticText(self, label='QuickLook:', pos=(70, 130))
        QuickLook.Bind(wx.EVT_BUTTON, self.onOpen)

    def onOpen(self, event):
        wildcard = "netCDF4 files (*.nc)|*.nc"
        dialog = wx.FileDialog(self, "Open netCDF4 Files| HDF5 files", wildcard=wildcard,
                               style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST)

        if dialog.ShowModal() == wx.ID_CANCEL:
            return


        path = dialog.GetPath()

  # panel for visualization       
class LeftPanelBottom(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent,style = wx.SUNKEN_BORDER)
        self.SetBackgroundColour('whitesmoke')
        self.dateLbl = wx.StaticBox(self, -1, 'QuickLook', size=(310, 600))

该代码用于在python3.6中读取和查看netcdf4:

import numpy as np
import netCDF4
import matplotlib.pyplot as plt

#read the  netcdf
fic='g_xvxvxvxv_20190108T120000Z.nc'

path='/home/globe/2019/01/08/'

nc = netCDF4.Dataset(path+fic,'r')
#read one variable in netcfd file
cm=nc.variables['cm'][:]

#visualization 
plt.pcolormesh(cm)
plt.colorbar()
plt.show()

我在panel2中看到的像quicklook:

enter image description here

我想做的是使用我的代码读取我代码中的.nc,并且我的用户可以选择一个文件,然后自动在另一个面板上显示2:

enter image description here

也许像这个例子:How to use matplotlib blitting to add matplot.patches to an matplotlib plot in wxPython?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

只需打开另一个帧,然后将要解码,未压缩,要显示的文件名传递给它。
另一种选择是使用webbrowser,它会根据您在PC上设置的首选项自动选择显示文件所需的程序。

import wx
import webbrowser
import numpy as np
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure


class MyFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        panel = wx.Panel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.select_button = wx.Button(panel, label="Select file")
        sizer.Add(self.select_button, 0, 0, 0)
        self.select_button.Bind(wx.EVT_BUTTON, self.pick_file)
        self.load_options = "netCDF4 files (nc)|*.nc| Text files (txt) |*.txt| All files |*.*"
        panel.SetSizer(sizer)

    def pick_file(self, event):
        with wx.FileDialog(self, "Pick files", wildcard=self.load_options,
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST | wx.FD_MULTIPLE) as fileDialog:
            if fileDialog.ShowModal() != wx.ID_CANCEL:
                chosen_file = fileDialog.GetPath()
                if chosen_file.endswith('.txt'):
                    #Method 1 using another frame
                    QuickLook(parent=self, text=chosen_file)
                elif chosen_file.endswith('.nc'):
                    QuickLook_plot(parent=self, text=chosen_file)
                else:
                    #Method 2 (the smart method) using webbrowser which chooses the application
                    # to use to display the file, based on preferences on your machine
                    webbrowser.open_new(chosen_file)

class QuickLook(wx.Frame):
    def __init__(self,parent,text=None):
        wx.Frame.__init__(self, parent, wx.ID_ANY, "Quick Look", size=(610,510))
        panel = wx.Panel(self, wx.ID_ANY, size=(600,500))
        log = wx.TextCtrl(panel, wx.ID_ANY,size=(600,480),
                        style = wx.TE_MULTILINE|wx.TE_READONLY|wx.VSCROLL)
        Quit_button = wx.Button(panel, wx.ID_ANY, "&Quit")
        Quit_button.Bind(wx.EVT_BUTTON, self.OnQuit)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(log, 1, wx.ALL|wx.EXPAND, 0)
        sizer.Add(Quit_button,0,wx.ALIGN_RIGHT)
        panel.SetSizerAndFit(sizer)

        # use whatever method is appropriate for the file type
        # to read, decode, uncompress, etc at this point
        # I am assuming a text file below.
        try:
            with open(text,'rt') as f:
                TextInfo = f.read()
            log.write(TextInfo)
            log.SetInsertionPoint(0)
            self.Show()
        except:
            self.OnQuit(None)

    def OnQuit(self,event):
        self.Close()
        self.Destroy()

class QuickLook_plot(wx.Frame):
    def __init__(self, parent,text=None):
        wx.Frame.__init__(self, parent, wx.ID_ANY, "Quick Plot", size=(610,510))
        panel = wx.Panel(self, wx.ID_ANY, size=(600,500))
        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        self.canvas = FigureCanvas(panel, -1, self.figure)
        Quit_button = wx.Button(panel, wx.ID_ANY, "&Quit")
        Quit_button.Bind(wx.EVT_BUTTON, self.OnQuit)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.sizer.Add(Quit_button, 0,wx.ALIGN_RIGHT)
        panel.SetSizerAndFit(self.sizer)
        #plot figure
        t = np.arange(0.0, 30.0, 0.01)
        s = np.sin(2 * np.pi * t)
        self.axes.plot(t, s)
        self.Show()

    def OnQuit(self,event):
        self.Close()
        self.Destroy()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'A test dialog')
        frame.Show()
        return True

if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

enter image description here

enter image description here