在我的 Python 程序中是我创建的数学对象的层次结构,代表数学公式。
例如,有 Collection
,它是一系列 Equations
,它是两个 Sums
、Products
的容器, 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 曾经存在用于此确切任务,但已被弃用。
- 然后我读到
sympy
、svgmath
和 QSvgWidget
的组合有效,将公式显示为 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_())