Mathtext Wx Sgskip

PythonPythonBeginner
Jetzt üben

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

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden Sie durch die Erstellung einer wxPython-Anwendung geführt, die mathematische Texte in einem wx.Bitmap anzeigt, um in verschiedenen Steuerelementen von wxPython angezeigt zu werden. Es verwendet die Matplotlib-Bibliothek, um Texte in Bilder umzuwandeln, und die wxPython-Bibliothek, um die Bilder anzuzeigen.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Installieren Sie die erforderlichen Bibliotheken

Um dieses Lab abzuschließen, müssen Sie die folgenden Bibliotheken installiert haben:

  • wxPython
  • Matplotlib

Sie können diese Bibliotheken mit pip installieren.

pip install wxPython
pip install matplotlib

Erstellen Sie eine wxPython-Anwendung

Erstellen Sie eine neue Python-Datei und importieren Sie die erforderlichen Bibliotheken.

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

Konvertieren von Mathtext in wx.Bitmap

Definieren Sie eine Funktion, die Mathtext in ein wx.Bitmap konvertiert. Diese Funktion verwendet Matplotlib, um den Text an der Position (0, 0) zu zeichnen, aber setzt dann auf facecolor="none" und bbox_inches="tight", pad_inches=0 zurück, um eine transparente Maske zu erhalten, die dann in ein wx.Bitmap geladen wird.

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

Definieren von Funktionen

Definieren Sie eine Liste von Funktionen, die die Anwendung anzeigen wird. Jede Funktion wird durch einen Mathtext und eine Lambda-Funktion definiert, die einen Eingabewert annimmt und einen Ausgabewert zurückgibt.

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

Erstellen eines Canvas-Fensters

Erstellen Sie eine neue Klasse, die von wx.Frame erbt. Diese Klasse erstellt eine Leinwand, auf der die ausgewählte Funktion angezeigt wird.

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

Fügen Sie eine Schaltflächenleiste hinzu

Fügen Sie einer Anwendung eine Schaltflächenleiste hinzu, die Icons für jede Funktion anzeigt. Wenn auf eine Schaltfläche geklickt wird, wird die entsprechende Funktion in der Anwendung angezeigt.

    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)

Fügen Sie eine Symbolleiste hinzu

Fügen Sie einer Anwendung eine Symbolleiste hinzu, die dem Benutzer ermöglicht, in und auszurichten, zu verschieben und das Diagramm als Bild zu speichern. Diese Symbolleiste wird am unteren Rand des Fensters hinzugefügt.

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

Ändern des Diagramms

Definieren Sie eine Funktion, die das Diagramm basierend auf der ausgewählten Funktion ändert. Diese Funktion nimmt eine plot_number als Eingabe und ändert das Diagramm entsprechend.

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

Erstellen der Anwendung

Erstellen Sie eine neue Klasse, die von wx.App erbt. Diese Klasse erstellt das Fenster und startet die Ereignisschleife.

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

Führen Sie die Anwendung aus

Führen Sie die Anwendung aus, indem Sie eine Instanz der MyApp-Klasse erstellen.

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

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie eine wxPython-Anwendung erstellen, die mathematischen Text in einem wx.Bitmap anzeigt. Sie haben die Matplotlib-Bibliothek verwendet, um Text in Bilder umzuwandeln, und die wxPython-Bibliothek, um die Bilder anzuzeigen. Sie haben auch gelernt, wie Sie in der Anwendung eine Schaltflächenleiste und eine Symbolleiste erstellen und wie Sie das Diagramm basierend auf der ausgewählten Funktion ändern.