有点复杂,但我会尝试
我有一个面板或一个按钮“ 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:
我想做的是使用我的代码读取我代码中的.nc,并且我的用户可以选择一个文件,然后自动在另一个面板上显示2:
也许像这个例子:How to use matplotlib blitting to add matplot.patches to an matplotlib plot in wxPython?
感谢您的帮助
答案 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()