Как встроить график в wx.SplitterWindow (правая панель)? - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь встроить график в правую панель окна Splitter, как добавить график внутри окна Splitter. пожалуйста, найдите здесь ссылку на набор данных. https://www.dropbox.com/s/ncy6dlpm79p578s/Dataset.zip?dl=0. Файл содержит строки и столбцы длины волны и коэффициента отражения.

import wx
from pylab import *
import asciitable

import matplotlib.pyplot as plt
import os
from wxmplot import ImageMatrixFrame
class RandomObj(object):
def __init__(self, name):
self.name = name
class SLI(wx.Frame):   
def __init__(self):
wx.Frame.__init__(self, None, -1, size=(820, 450))
splitter = wx.SplitterWindow(self, style = wx.SP_BORDER)
leftPanel = wx.Panel(splitter, size=(400,100))
rightPanel = wx.Panel(splitter, size=(400,100))

        ####Tree Widget#####
        self.tree = wx.TreeCtrl(leftPanel)
        leftSizer = wx.BoxSizer(wx.VERTICAL)
        leftSizer.Add(self.tree, 1, wx.EXPAND | wx.ALIGN_CENTER)
        leftPanel.SetSizer(leftSizer)
        rightSizer = wx.BoxSizer(wx.VERTICAL)
        self.display = wx.StaticText(rightPanel, -1, '', (10, 10),
                                     style=wx.ALIGN_CENTRE)
        rightSizer.Add(self.display, -1, wx.EXPAND)
        rightPanel.SetSizer(rightSizer)
        splitter.SplitVertically(leftPanel, rightPanel)
        ##### Splitter ends ####

    root = self.tree.AddRoot('Database')
        self.tree.AppendItem(root, 'USGS')
        files = []
        self.dname = []
        self.test = []
        for dirname, dirnames, filenames in os.walk('.\USGS'):
                for filename in filenames:
                    files.append(os.path.join(dirname, filename))
                    self.test.append(filename)
                    self.tree.AppendItem(self.tree.GetLastChild(root), filename)
                self.dname = files[:]

        self.tree.AppendItem(root,'ASTER')
        for dirname, dirnames, filenames in os.walk('.\ASTER'):
                for filename in filenames:
                    files.append(os.path.join(dirname, filename))
                    self.test.append(filename)
                    self.tree.AppendItem(self.tree.GetLastChild(root), filename)
                self.dname = files[:]
        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.ASTER, self.tree)

    def ASTER(self, event):
        self.item = event.GetItem()
        value1 = self.tree.GetItemText(self.item)
        value2 = 0
        value3 = 1
        self.item=None
        for k in self.test:
            if value1 == k:
                value2 +=1
                break
            else:
                value2 +=1
        for i in self.dname:
            if value3 == value2:
                array =[]
                f=open(i, 'r')
                for j in xrange(27):
                    f.next()
                for line in f:
                    array.append(line)
                data = asciitable.read(array)
                plot(data.col1, data.col2)
                title(value1)
                show()
                break
            else:
                value3 +=1
app = wx.App(None)
frame = ImageMatrixFrame()
SLI().Show()
app.MainLoop()

как вставить окно графика внутри правой панели сплиттера.

1 Ответ

0 голосов
/ 29 января 2020

Я не уверен на 100%, что понимаю ваш код - наверняка есть проблемы с форматированием и отступами. Я также не знаком с asciitable. Но, тем не менее, wxmplot.PlotPanel или ImagePanel могут быть встроены в фрейм wx Python, который использует Splitter. Пример может выглядеть как код ниже. Я пытался сделать его коротким, но также пытался сделать его полным и используя обычный wx Python. Для более полного приложения вы, вероятно, захотите поместить чтение файлов данных в отдельный класс, например, c. В любом случае, это использует вашу папку Dataset, и в основном должно работать, чтобы показать концепции:

#!/usr/bin/env python
import os
import wx
from wxmplot import PlotPanel

# see https://gist.github.com/newville/e805a6454c4e4c0e010bf0b3cc796d52
from  asciifile import read_ascii

LEFTSTYLE = wx.ALIGN_LEFT|wx.GROW|wx.ALL

def pack(window, sizer, expand=1.1):
    "simple wxPython pack function"
    tsize = window.GetSize()
    msize = window.GetMinSize()
    window.SetSizer(sizer)
    sizer.Fit(window)
    nsize = (int(1.1*max(msize[0], tsize[0])),
             int(1.1*max(msize[1], tsize[1])))
    window.SetSize(nsize)

class SpectraPlotterFrame(wx.Frame):
    def __init__(self, data_folder):
        wx.Frame.__init__(self, None, size=(800, 450))

        self.SetTitle("Data File Plotter: {:s}".format(data_folder))
        self.data_folder = data_folder
        self.current_filename = None

        splitter  = wx.SplitterWindow(self, style=wx.SP_LIVE_UPDATE)
        splitter.SetMinimumPaneSize(200)

        # left side: ListBox of File Names
        l_panel = wx.Panel(splitter)
        l_sizer = wx.BoxSizer(wx.VERTICAL)
        self.filelist = wx.ListBox(l_panel)
        self.filelist.Bind(wx.EVT_LISTBOX,  self.onFileChoice)

        l_sizer.Add(self.filelist, 1, LEFTSTYLE, 5)
        pack(l_panel, l_sizer)

        # right side: Panel to choose plot array labels, make plot
        r_panel = wx.Panel(splitter)
        r_sizer = wx.GridBagSizer(3, 3)


        self.xarr = wx.Choice(r_panel, choices=[], size=(175, -1))
        self.yarr = wx.Choice(r_panel, choices=[], size=(175, -1))
        xlabel = wx.StaticText(r_panel, label='X:', style=LEFTSTYLE)
        ylabel = wx.StaticText(r_panel, label='Y:', style=LEFTSTYLE)

        plot_btn = wx.Button(r_panel, label='Show Plot', size=(125, -1))
        plot_btn.Bind(wx.EVT_BUTTON, self.onPlot)

        self.plotpanel = PlotPanel(r_panel, size=(650, 450))

        r_sizer.Add(xlabel,    (0, 0), (1, 1), LEFTSTYLE, 2)
        r_sizer.Add(self.xarr, (0, 1), (1, 1), LEFTSTYLE, 2)
        r_sizer.Add(ylabel,    (0, 2), (1, 1), LEFTSTYLE, 2)
        r_sizer.Add(self.yarr, (0, 3), (1, 1), LEFTSTYLE, 2)
        r_sizer.Add(plot_btn,  (0, 4), (1, 1), LEFTSTYLE, 2)
        r_sizer.Add(self.plotpanel, (1, 0), (1, 6), LEFTSTYLE, 2)
        pack(r_panel, r_sizer)

        splitter.SplitVertically(l_panel, r_panel, 1)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(splitter, 1, LEFTSTYLE, 5)
        pack(self, sizer)

        wx.CallAfter(self.read_datafiles)
        self.Show()
        self.Raise()

    def read_datafiles(self):
        self.datasets = {}
        dfolder = os.path.abspath(self.data_folder)

        for fname in sorted(os.listdir(self.data_folder)):
            try:
                self.datasets[fname] = read_ascii(os.path.join(dfolder, fname))
            except:
                print("Could not read file {:s}".format(fname))
            self.filelist.Append(fname)

    def onFileChoice(self, event=None):
        self.current_filename = fname = event.GetString()
        for choice, default in ((self.xarr, 0), (self.yarr, 1)):
            choice.Clear()
            choice.AppendItems(self.datasets[fname].array_labels)
            choice.SetSelection(default)

    def onPlot(self, event=None):
        x = self.xarr.GetSelection()
        y = self.yarr.GetSelection()
        xlab = self.xarr.GetStringSelection()
        ylab = self.yarr.GetStringSelection()

        if self.current_filename is not None:
            dset = self.datasets[self.current_filename]
            self.plotpanel.plot(dset.data[x], dset.data[y], xlabel=xlab,
                                ylabel=ylab, label=self.current_filename,
                                show_legend=True)


class SpectraPlotterApp(wx.App):
    def __init__(self, data_folder='.', **kws):
        self.data_folder = data_folder
        wx.App.__init__(self, **kws)

    def createApp(self):
        frame = SpectraPlotterFrame(data_folder=self.data_folder)
        self.SetTopWindow(frame)

    def OnInit(self):
        self.createApp()
        return True

if __name__ == '__main__':
    SpectraPlotterApp(data_folder='Dataset').MainLoop()
...