Ant*_*rth 6 python markup algebra formula pyqt4
在我的 python 程序中,我创建了一个数学对象的层次结构,代表数学公式。
例如,有Collection,它是一系列Equations,它是两个Sums, Products, Quotients,Exponants或的容器Logarithms,它们都是建立在 上的Figures,可以是数字或变量。
我需要向用户显示为实现某些任务而执行的数学运算步骤,例如获取未知变量等。目前,我以纯文本形式生成此“指南”,很像...
F = (m)(a)
m = (F)/(a)
a = 2, F = 3
m = (3)/(2) = 1.5
Run Code Online (Sandbox Code Playgroud)
然而,用纯文本(例如:)表示复杂的公式log[2](n)=(m)((a)^(2))是丑陋的,并且违背了程序的一个目标,即为用户保持程序的最高清晰度。
我目前正在 PyQt4 中编写 GUI,并且需要对可以在 Qt 应用程序中显示的公式(每个步骤)进行表示。公式不需要在文本中。由于对象结构的原因,根据需要将对象转换为标记文本非常容易。实际的显示方法可以是任何东西,只要我可以在我的 GUI 中干净利落地将其放入,例如 SVG、图像等。
sympy,svgmath并QSvgWidget工作的组合,将公式显示为 Svgs,但我需要我的代码是可分发的,这是设置 svgmath 中的字体配置内容所禁止的。我几乎倾向于自己编码,使用 PIL 或类似的东西将我的数学对象直接转换为图像,但我不想认为有人已经实现了这一点,并且做得更好。
非常感谢任何和所有帮助!
谢谢!
小智 6
来自博客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_())
Run Code Online (Sandbox Code Playgroud)
翻译为 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_())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4323 次 |
| 最近记录: |