6

私のpythonプログラムでは、私が作成した数式を表す数学オブジェクトの階層があります。
たとえばCollection、一連の、 、、、またはEquationsのコンテナである があります。これらはすべて 上の施設であり、数値または変数にすることができます。SumsProductsQuotientsExponantsLogarithmsFigures

未知の変数の取得など、特定のタスクを達成するために実行する数学演算のステップをユーザーに表示する必要があります。現在、この「ガイド」をプレーンテキストで生成しています...

F = (m)(a)  
m = (F)/(a)  
a = 2, F = 3  
m = (3)/(2) = 1.5

ただし、複雑な数式をプレーン テキスト (例: log[2](n)=(m)((a)^(2))) で表現するのは見苦しく、ユーザーに対して手順を明確に維持するというプログラムの目標に反します。

現在、PyQt4 で GUI を作成しており、Qt アプリケーションで表示できる式 (各ステップ) を表現する必要があります。数式はテキストである必要はありません。オブジェクトの構造により、必要に応じてオブジェクトをマークアップ テキストに変換するのは非常に簡単です。実際の表示方法は、SVG、画像など、GUI できれいにチャックできる限り、何でもかまいません。

  • 最初は MathML を検討していましたが、PyQt は HTML を表示するときに MathML タグを無視し、QMmlWidget はかつてこの正確なタスクのために存在していましたが、非推奨になっていることを読みました。
  • 次に、 の組み合わせを読み、sympysvgmathQSvgWidgetSvgs として表示して動作しましたが、コードを配布可能にする必要があります。
  • 私はこれが有望に見えると思った.LaTeX方程式を端末とインラインで表示する が、ビデオは合計でほぼ4時間の長さであり、私には忍耐力がない.

私は、PIL などを使用して数学オブジェクトを画像に直接変換して、自分でコーディングする傾向がありますが、誰かが既にこれをより良い仕事で達成しているとは思いたくありません。

すべてのヘルプは非常に高く評価されています!
ありがとう!

4

1 に答える 1

4

ブログGulon.co.ukから。彼女は、pyQt で LateX 方程式をレンダリングするためのシンプルかつ強力な例を提供しました。そこからコピーして以下に貼り付けました。

from PyQt4.QtCore import *

from PyQt4.QtGui import *

from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas


class MathTextLabel(QWidget):

    def __init__(self, mathText, parent=None, **kwargs):
        QWidget.__init__(self, parent, **kwargs)

        l=QVBoxLayout(self)
        l.setContentsMargins(0,0,0,0)

        r,g,b,a=self.palette().base().color().getRgbF()

    self._figure=Figure(edgecolor=(r,g,b), facecolor=(r,g,b))
    self._canvas=FigureCanvas(self._figure)
    l.addWidget(self._canvas)

    self._figure.clear()
    text=self._figure.suptitle(
        mathText,
        x=0.0,
        y=1.0,
        horizontalalignment='left',
        verticalalignment='top',
        size=qApp.font().pointSize()*2)
    self._canvas.draw()

    (x0,y0),(x1,y1)=text.get_window_extent().get_points()
    w=x1-x0; h=y1-y0

    self._figure.set_size_inches(w/80, h/80)
    self.setFixedSize(w,h)

if __name__=='__main__':
    from sys import argv, exit

    class Widget(QWidget):
        def __init__(self, parent=None, **kwargs):
            QWidget.__init__(self, parent, **kwargs)

            l=QVBoxLayout(self)
            l.addWidget(QLabel("<h1>Discrete Fourier Transform</h1>"))

            mathText=r'$X_k = \sum_{n=0}^{N-1} x_n . e^{\frac{-i2\pi kn}{N}}$'
            l.addWidget(MathTextLabel(mathText, self),     alignment=Qt.AlignHCenter)

    a=QApplication(argv)
    w=Widget()
    w.show()
    w.raise_()
    exit(a.exec_())

PyQt5 に翻訳

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtCore import Qt
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas


class MathTextLabel(QtWidgets.QWidget):

    def __init__(self, mathText, parent=None, **kwargs):
        super(QtWidgets.QWidget, self).__init__(parent, **kwargs)

        l=QVBoxLayout(self)
        l.setContentsMargins(0,0,0,0)

        r,g,b,a=self.palette().base().color().getRgbF()

        self._figure=Figure(edgecolor=(r,g,b), facecolor=(r,g,b))
        self._canvas=FigureCanvas(self._figure)
        l.addWidget(self._canvas)
        self._figure.clear()
        text=self._figure.suptitle(
            mathText,
            x=0.0,
            y=1.0,
            horizontalalignment='left',
            verticalalignment='top',
            size=QtGui.QFont().pointSize()*2
        )
        self._canvas.draw()

        (x0,y0),(x1,y1)=text.get_window_extent().get_points()
        w=x1-x0; h=y1-y0

        self._figure.set_size_inches(w/80, h/80)
        self.setFixedSize(w,h)

if __name__=='__main__':
    from sys import argv, exit

    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None, **kwargs):
            super(QtWidgets.QWidget, self).__init__(parent, **kwargs)

            l=QVBoxLayout(self)
            mathText=r'$X_k = \sum_{n=0}^{N-1} x_n . e^{\frac{-i2\pi kn}{N}}$'
            l.addWidget(MathTextLabel(mathText, self), alignment=Qt.AlignHCenter)

    a=QtWidgets.QApplication(argv)
    w=Widget()
    w.show()
    w.raise_()
    exit(a.exec_())
于 2017-06-16T15:57:01.980 に答える