在我的python程序中是我创建的数学对象的层次结构,它代表数学公式
例如,Collection
是一系列Equations
,它是两个Sums
,Products
,Quotients
,Exponants
的容器或Logarithms
,它们都是Figures
上的所有机构,可以是数字或变量。
我需要向用户显示执行某些任务的数学运算步骤,例如获取未知变量等。目前,我用纯文本生成这个'指南',就像...
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,图像等。
sympy
,svgmath
和QSvgWidget
的组合工作,将公式显示为Svgs,但我需要我的代码可分发,其中的字体配置为设置svgmath抑制。我几乎倾向于自己编写代码,使用PIL或类似的东西将我的数学对象直接转换为图像,但我不愿意认为有人已经实现了这一点,并且有更好的工作。
非常感谢任何和所有帮助! 谢谢!
答案 0 :(得分:1)
这个问题中接受的答案就像一个魅力 matplotlib - write TeX on Qt form
它直接在PyQt小部件中使用matplotlib的TeX渲染。
答案 1 :(得分:1)
来自博客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_())