Mathtext Wx Sgskip

PythonPythonBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire vous guidera dans la création d'une application wxPython qui affiche du texte mathématique dans un wx.Bitmap pour l'affichage dans divers contrôles de wxPython. Il utilise la bibliothèque Matplotlib pour convertir le texte en images et la bibliothèque wxPython pour afficher les images.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet pour accéder au Jupyter Notebook pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.

Installer les bibliothèques requises

Pour terminer ce laboratoire, vous devez avoir les bibliothèques suivantes installées :

  • wxPython
  • Matplotlib

Vous pouvez installer ces bibliothèques à l'aide de pip.

pip install wxPython
pip install matplotlib

Créer une application wxPython

Créez un nouveau fichier Python et importez les bibliothèques requises.

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

Convertir du texte mathématique en wx.Bitmap

Définissez une fonction qui convertit du texte mathématique en un wx.Bitmap. Cette fonction utilise Matplotlib pour tracer le texte à la position (0, 0), puis elle dépend de facecolor="none" et bbox_inches="tight", pad_inches=0 pour obtenir un masque transparent qui est ensuite chargé dans un 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))

Définir des fonctions

Définissez une liste de fonctions que l'application affichera. Chaque fonction est définie par un texte mathématique et une fonction lambda qui prend une valeur d'entrée et renvoie une valeur de sortie.

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))
]

Créer un cadre de canevas

Créez une nouvelle classe qui hérite de wx.Frame. Cette classe crée un canevas qui affiche la fonction sélectionnée.

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()

Ajouter une barre de boutons

Ajoutez une barre de boutons à l'application qui affiche des icônes pour chaque fonction. Lorsqu'un bouton est cliqué, l'application affichera la fonction correspondante.

    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)

Ajouter une barre d'outils

Ajoutez une barre d'outils à l'application qui permet à l'utilisateur de zoomer, de panser et d'enregistrer le tracé sous forme d'image. Cette barre d'outils est ajoutée en bas du cadre.

    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()

Changer le tracé

Définissez une fonction qui change le tracé en fonction de la fonction sélectionnée. Cette fonction prend un plot_number en entrée et change le tracé en conséquence.

    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()

Créer l'application

Créez une nouvelle classe qui hérite de wx.App. Cette classe crée le cadre et démarre la boucle d'événements.

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

Exécuter l'application

Exécutez l'application en créant une instance de la classe MyApp.

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

Sommaire

Dans ce laboratoire, vous avez appris à créer une application wxPython qui affiche du texte mathématique dans un wx.Bitmap. Vous avez utilisé la bibliothèque Matplotlib pour convertir le texte en images et la bibliothèque wxPython pour afficher les images. Vous avez également appris à créer une barre de boutons et une barre d'outils dans l'application et à changer le tracé en fonction de la fonction sélectionnée.