выделите файл на панели и визуализируйте на другой панели wxpython - PullRequest
0 голосов
/ 20 марта 2019

это немного сложно, но я попробую

У меня есть панель или кнопка «файл» для выбора файла, и открытием этого файла является файл .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))

что это код для чтения и просмотра netcdf4 в 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()

то, что я бы увидел в панели 2, как быстрый просмотр:

enter image description here

что я хотел бы сделать, это использовать мой код для чтения .nc в моем коде и чтобы мои пользователи могли просто выбрать файл и затем автоматически отобразить его на другой панели2:

enter image description here

может быть, как в этом примере: Как использовать блики matplotlib для добавления matplot.patches к графику matplotlib в wxPython?

спасибо за помощь

1 Ответ

1 голос
/ 21 марта 2019

Просто откройте другой кадр и передайте ему имя файла, который будет декодирован, распакован, что угодно, для отображения.
Другой вариант - использовать webbrowser, который автоматически выберет программу, необходимую для отображения файла, в соответствии с настройками, установленными на вашем компьютере.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...