selection file in a panel and visualize in another

2019-06-13 17:13发布

问题:

it's a little complicated but I will try

I have a panel or a button 'file' for the choice of a file and the opening of this file is a .nc file (netCDF4) so I would like to visualize it but the problem I would like to see it in one other panel which will be like a quicklook, and each time you have to choose a file of type .nc or directly to be visualized on the other panel

and here is part of my code for 2 panels:

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))

that it code for read and view netcdf4 in python3.6:

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()

that what i would see in panel2 like quicklook:

what i would like to do is use my code to read the .nc in my code and that my users can just choose a file and then display automatically on the other panel2 :

maybe is like this example : How to use matplotlib blitting to add matplot.patches to an matplotlib plot in wxPython?

thank you for the help

回答1:

Just open another frame and pass it the filename to be decoded, uncompressed, whatever, to be displayed.
The other option is to use webbrowser which will automatically pick the program required to display the file, based on the preferences that you have set on your 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()