python - 在 PyQt 中(很好地)显示一个代数表达式

标签 python pyqt4 formula markup algebra

<分区>

在我的 Python 程序中是我创建的数学对象的层次结构,代表数学公式。
例如,有 Collection,它是一系列 Equations,它是两个 SumsProducts 的容器, Quotients, Exponants or Logarithms, 都是建立在数字上的,可以是数值也可以是变量。

我需要向用户显示为实现某些任务而执行的数学运算步骤,例如获取未知变量等。目前,我以纯文本格式生成此“指南”,就像...

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

然而,用纯文本表示复杂的公式(例如:log[2](n)=(m)((a)^(2)))是丑陋的,并且违背了目标该程序,旨在为用户保持程序的最高清晰度。

我目前正在用 PyQt4 编写 GUI,并且需要对可以在 Qt 应用程序中显示的公式(每个步骤)进行表示。公式不需要在文本中。由于对象结构,根据需要将对象转换为标记文本非常容易。实际的显示方法可以是任何东西,只要我可以将它干净利落地放入我的 GUI 中,例如 SVG、图像等。

  • 起初,我考虑过 MathML,但读到 PyQt 在显示 HTML 时会忽略 MathML 标记,并且 QMmlWidget 曾经存在用于此确切任务,但已被弃用。
  • 然后我读到 sympysvgmathQSvgWidget 的组合有效,将公式显示为 Svgs,但我需要我的代码可分发,设置 svgmath 中的字体配置内容会抑制。
  • 我认为这看起来很有希望:Display LaTeX Equations in-line with terminal但视频总时长将近 4 小时,我没有耐心。

我几乎倾向于自己编写代码,使用 PIL 或类似的东西将我的数学对象直接转换为图像,但我不愿意认为有人已经做到了这一点,而且做得更好。

非常感谢任何帮助!
谢谢!

最佳答案

来自博客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_())

关于python - 在 PyQt 中(很好地)显示一个代数表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14097463/

相关文章:

python - Ruby optparse 限制

r - 使用字符串作为 ipwtm 函数的公式?

python - QueryParser.parse,限制单词之间的距离

python - raven.contrib.django.handlers.SentryHandler 是异步的吗?

python - 如何在 QMenu 中隐藏子菜单

python - 3 秒后隐藏帧/通过调用函数(需要以两种方式完成)

database - SQLite3 数据库中的派生字段

Excel:从单元格中提取由标记分隔的文本字符串的公式

python - 如果应用程序版本低于 1.5.5,则跳过 Python 测试