Mathtext Wx Sgskip

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Este laboratório irá guiá-lo através da criação de uma aplicação wxPython que exibe texto matemático em um wx.Bitmap para exibição em vários controles no wxPython. Ele utiliza a biblioteca Matplotlib para converter texto em imagens e a biblioteca wxPython para exibir as imagens.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Instalar as Bibliotecas Necessárias

Para completar este laboratório, você precisa ter as seguintes bibliotecas instaladas:

  • wxPython
  • Matplotlib

Você pode instalar essas bibliotecas usando o pip.

pip install wxPython
pip install matplotlib

Criar uma Aplicação wxPython

Crie um novo arquivo Python e importe as bibliotecas necessárias.

import wx
import numpy as np
from io import BytesIO
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas
from matplotlib.figure import Figure

Converter Mathtext para wx.Bitmap

Defina uma função que converte texto matemático (mathtext) para um wx.Bitmap. Esta função usa Matplotlib para desenhar o texto na posição (0, 0), mas então se baseia em facecolor="none" e bbox_inches="tight", pad_inches=0 para obter uma máscara transparente que é então carregada em um wx.Bitmap.

def mathtext_to_wxbitmap(s):
    fig = Figure(facecolor="none")
    text_color = (
        np.array(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT)) / 255)
    fig.text(0, 0, s, fontsize=10, color=text_color)
    buf = BytesIO()
    fig.savefig(buf, format="png", dpi=150, bbox_inches="tight", pad_inches=0)
    s = buf.getvalue()
    return wx.Bitmap.NewFromPNGData(s, len(s))

Definir Funções

Defina uma lista de funções que a aplicação irá exibir. Cada função é definida por um texto matemático (math text) e uma função lambda que recebe um valor de entrada e retorna um valor de saída.

functions = [
    (r'$\sin(2 \pi x)$', lambda x: np.sin(2*np.pi*x)),
    (r'$\frac{4}{3}\pi x^3$', lambda x: (4/3)*np.pi*x**3),
    (r'$\cos(2 \pi x)$', lambda x: np.cos(2*np.pi*x)),
    (r'$\log(x)$', lambda x: np.log(x))
]

Criar um Frame de Canvas

Crie uma nova classe que herda de wx.Frame. Esta classe cria um canvas que exibe a função selecionada.

class CanvasFrame(wx.Frame):
    def __init__(self, parent, title):
        super().__init__(parent, -1, title, size=(550, 350))

        self.figure = Figure()
        self.axes = self.figure.add_subplot()

        self.canvas = FigureCanvas(self, -1, self.figure)

        self.change_plot(0)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.add_buttonbar()
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)

        self.SetSizer(self.sizer)
        self.Fit()

Adicionar uma Barra de Botões

Adicione uma barra de botões à aplicação que exibe ícones para cada função. Quando um botão é clicado, a aplicação exibirá a função correspondente.

    def add_buttonbar(self):
        self.button_bar = wx.Panel(self)
        self.button_bar_sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.button_bar, 0, wx.LEFT | wx.TOP | wx.GROW)

        for i, (mt, func) in enumerate(functions):
            bm = mathtext_to_wxbitmap(mt)
            button = wx.BitmapButton(self.button_bar, 1000 + i, bm)
            self.button_bar_sizer.Add(button, 1, wx.GROW)
            self.Bind(wx.EVT_BUTTON, self.OnChangePlot, button)

        self.button_bar.SetSizer(self.button_bar_sizer)

Adicionar uma Barra de Ferramentas

Adicione uma barra de ferramentas à aplicação que permite ao utilizador aumentar e diminuir o zoom, deslocar (pan) e guardar o gráfico como uma imagem. Esta barra de ferramentas é adicionada à parte inferior do frame.

    def add_toolbar(self):
        self.toolbar = NavigationToolbar2Wx(self.canvas)
        self.toolbar.Realize()
        self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        self.toolbar.update()

Alterar o Gráfico

Defina uma função que altera o gráfico com base na função selecionada. Esta função recebe um plot_number como entrada e altera o gráfico de acordo.

    def change_plot(self, plot_number):
        t = np.arange(1.0, 3.0, 0.01)
        s = functions[plot_number][1](t)
        self.axes.clear()
        self.axes.plot(t, s)
        self.canvas.draw()

Criar a Aplicação

Crie uma nova classe que herda de wx.App. Esta classe cria o frame e inicia o loop de eventos.

class MyApp(wx.App):
    def OnInit(self):
        frame = CanvasFrame(None, "wxPython mathtext demo app")
        self.SetTopWindow(frame)
        frame.Show(True)
        return True

Executar a Aplicação

Execute a aplicação criando uma instância da classe MyApp.

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

Resumo

Neste laboratório, você aprendeu como criar uma aplicação wxPython que exibe texto matemático em um wx.Bitmap. Você utilizou a biblioteca Matplotlib para converter texto em imagens e a biblioteca wxPython para exibir as imagens. Você também aprendeu como criar uma barra de botões e uma barra de ferramentas na aplicação e como alterar o gráfico com base na função selecionada.