Подгонка рисунка matplotlib к wxpnel - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь отобразить график в wxpanel таким образом, чтобы при инициализации он имел разрыв в 5 пикселей от левого верхнего и правого краев.

Я попробовал код ниже, но он выглядит, как при создании графика. придерживается правого края панели. После изменения размера пробел появится.

# -*- coding: utf-8 -*-

import wx
#import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from relpermtable import RelPermTable as RelPermCl

class KrPanel(wx.Panel):

    def __init__(self, parent):
        super().__init__(parent)
        main_sizer = wx.BoxSizer(wx.VERTICAL)

        self.list_ctrl = wx.ListCtrl(
                self, size = (-1, 300),
                style = wx.LC_REPORT | wx.BORDER_SUNKEN
        )

        self.list_ctrl.InsertColumn(0,  'Sw', width=100)
        self.list_ctrl.InsertColumn(1, 'Krw', width=100)
        self.list_ctrl.InsertColumn(2, 'Krg', width=100)
        self.list_ctrl.InsertColumn(3,  'Pc', width=100)
        main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 5)

        self.SetSizer(main_sizer)

    def load_KrPc_data(self, in_dfr):
        for index, row in in_dfr.iterrows():
            self.list_ctrl.InsertItem(index, str(row["Sg"]))
            self.list_ctrl.SetItem(index, 1, str(row["Krg"]))
            self.list_ctrl.SetItem(index, 2, str(row["Krw"]))
            self.list_ctrl.SetItem(index, 3, str(row["Pc"]))

class PlotPanel(wx.Panel):
    def __init__(self, parent):
        super().__init__(parent)

    def PlotKrPcData(self, df_in, in_swco, in_sgco):
        right_sizer = wx.BoxSizer(wx.VERTICAL)
        self.fig, self.ax1 = plt.subplots() # figsize=(5,5)
#        self.ax2 = self.ax1.twinx()
        self.ax1.plot(df_in['Sg'], df_in['Krg'], 'r-')
        self.ax1.plot(df_in['Sg'], df_in['Krw'], 'g-')
#        self.ax2.plot(new_df['Sg'], new_df['Pc'], 'b-')
        self.ax1.plot((1-in_swco), 0, 'go')
        self.ax1.annotate('1-SWL', ((1-in_swco), 0.05))
        self.ax1.plot((in_sgco), 0, 'go', label = 'SGL')
        self.ax1.annotate('SGL', (in_sgco, 0.05))
        self.canvas = FigureCanvas(self, -1, self.fig)
        right_sizer.Add(self.canvas, 0, wx.ALL | wx.EXPAND, 5)
        self.SetSizer(right_sizer)

class KrFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None,
             title='Gas Relative Permeability Editor', size=(900, 800))
        self.sp = wx.SplitterWindow(self)
        self.panel01 = KrPanel(self.sp)
        self.panel02 = PlotPanel(self.sp)
        self.sp.SplitVertically(self.panel01, self.panel02, 450)
        self.create_menu()
        self.Show()

    def create_menu(self):
        menu_bar = wx.MenuBar()
        file_menu = wx.Menu()
        open_file_menu_item = file_menu.Append(
                wx.ID_ANY, 'Open File', 'Open a Relative Permeability File'
        )
        exit_menu_item = file_menu.Append(
                wx.ID_EXIT, "Exit", "Exit the application"
        )
        menu_bar.Append(file_menu, '&File')
        self.Bind(
                event = wx.EVT_MENU,
                handler = self.on_open_file,
                source = open_file_menu_item
        )
        self.Bind(
                event = wx.EVT_MENU,
                handler = self.on_exit,
                source = exit_menu_item
        )
        self.SetMenuBar(menu_bar)

    def on_open_file(self, event):
        title = "Choose a Relative Permeability file:"
        dlg = wx.FileDialog(self, title, "", "",
                           "Eclipse include files (*.INC) | *.INC", style = wx.FD_DEFAULT_STYLE)
        if dlg.ShowModal() == wx.ID_OK:
            object = RelPermCl(dlg.GetPath())
            new_df = object.load_KrPc_data()
            new_sgco = object.calc_sgco()
            new_swco = object.calc_swco()
#            new_sgmax = object.calc_sgmax()
#            new_swmax = object.calc_swmax()
#            new_sgcr = object.calc_sgcr()
#            new_swcr = object.calc_swcr()
            self.panel01.load_KrPc_data(new_df)
            self.panel02.PlotKrPcData(new_df, new_sgco, new_swco)
#            print(new_df.head())
        dlg.Destroy()

    def on_exit(self, e):
        self.Close()

if __name__ == '__main__':
    app = wx.App(False)
    frame = KrFrame()
    app.MainLoop()
    del app

Я хотел бы иметь 5-пиксельный разрыв справа от графика при его создании. Но как-то разрыв создается только после изменения размера. Есть ли способ установить размер графика, скажем, размер панели независимо от размера панели и указать размеры границ?

1 Ответ

0 голосов
/ 05 ноября 2019

Попробуйте поставить frame.SendSizeEvent () перед вызовом Show. Если это не работает, попробуйте с wx.CallAfter (frame.SendSizeEvent)

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