Панель wxpython уменьшается после создания графика - PullRequest
0 голосов
/ 21 марта 2019

У меня очень простая панель, где вы нажимаете кнопку, и создается график (с помощью matplotlib), и график сохраняется как .png в моей рабочей папке.

После создания графика размер моей панели уменьшается. Кто-нибудь знает, почему это так?

Ниже приведен код, а затем снимки экрана до и после нажатия кнопки.

import wx
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

class MyApp(wx.App):
    def __init__(self):
        super().__init__(clearSigInt=True)
        self.InitFrame()

    def InitFrame(self):
        frame = MyFrame(parent=None, title='My Frame', pos = (100,100))
        frame.Show()

class MyFrame(wx.Frame):
    def __init__(self, parent, title, pos):
        super().__init__(parent=parent, title=title, pos=pos)
        self.OnInit()

    def OnInit(self):
        panel = MyPanel(parent=self)

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

        button = wx.Button(parent=self, label = "Create plot", pos = (20,80))
        button.Bind(event=wx.EVT_BUTTON, handler=self.onSubmit)

    def onSubmit(self,event):
        ActivityDF = pd.DataFrame({
            'Activity': ['A','B','C','D'],
            'Count': [10,20,30,40]
        })
        fig, ax = plt.subplots(1)
        ax.barh(ActivityDF['Activity'], ActivityDF['Count'])
        fig.savefig('Figure.png',bbox_inches='tight', facecolor="None")   



if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

До нажатия кнопки После нажатия кнопки

1 Ответ

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

Добро пожаловать в переполнение стека.

Во-первых, ваш код немного усложнен.Нет необходимости использовать так много классов.

Во-вторых, если вы планируете использовать matplotlib с библиотекой GUI, вам нужно импортировать бэкэнд, чтобы matplotlib прекрасно работал в приложении, которое вы пишете.

Относительно того, почему панель сжимается.Я не совсем уверен.Возможно ошибка, когда matplotlib пытается построить без подходящего бэкэнда.

Я упростил ваш код и добавил к нему некоторые комментарии.

import wx
import numpy as np

import matplotlib as mpl
## Import the matplotlib backend for wxPython
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas

## Only one class is really needed in this case. There is no need to have 
## a class for the App, a class for the frame and a class for the panel
class MyWin(wx.Frame):
    def __init__(self, title, pos):
        super().__init__(parent=None, title=title, pos=pos)

        self.panel = wx.Panel(parent=self)
        self.button = wx.Button(parent=self.panel, label='Create plot', pos=(20, 80))

        self.button.Bind(wx.EVT_BUTTON, self.onSubmit)

    def onSubmit(self, event):
        x = np.arange(10)
        y = np.arange(10)
        ## This is to work with matplotlib inside wxPython
        ## I prefer to use the object oriented API
        self.figure  = mpl.figure.Figure(figsize=(5, 5))
        self.axes    = self.figure.add_subplot(111)
        self.canvas  = FigureCanvas(self, -1, self.figure)
        ## This is to avoid showing the plot area. When set to True
        ## clicking the button show the canvas and the canvas covers the button
        ## since the canvas is placed by default in the top left corner of the window
        self.canvas.Show(False)
        self.axes.plot(x, y)
        self.figure.savefig('Figure.png', bbox_inches='tight', facecolor='None')          

if __name__ == '__main__':
    app = wx.App()
    win = MyWin('My Frame', (100, 100))
    win.Show()
    app.MainLoop() 

Надеюсь, это поможет.

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