在PyQ中显示(很好)一个代数表达式

2024-09-28 03:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的python程序中,是我创建的数学对象的层次结构,它们代表数学公式。
例如,Collection,它是一系列的Equations,它是两个SumsProductsQuotientsExponants或{},它们都是{}上的建立,可以是数值或变量。在

我需要向用户显示一个数学运算的步骤来完成某些任务,例如获取未知变量等。目前,我生成这个纯文本的“指南”,很像。。。在

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曾经存在于这个确切的任务中,但是已经被弃用了。在
  • 然后我读到sympysvgmath和{}的组合起作用了,将公式集显示为svg,但我需要代码是可分发的,这是设置svgmath时的字体配置所禁止的。在
  • 我认为这看起来很有希望:Display LaTeX Equations in-line with terminal但是这些视频总共持续了将近4个小时,对此我没有耐心。在

我几乎倾向于自己编写代码,使用PIL或类似的方法将我的数学对象直接转换为图像,但我不希望有人已经用更好的工作实现了这一点。在

非常感谢您的任何帮助!
谢谢!在


Tags: 对象方法代码用户标记图像文本程序
1条回答
网友
1楼 · 发布于 2024-09-28 03:23:07

来自博客Gulon.co.uk。她提供了一个简单而强大的示例,用于在pyQt中渲染乳胶方程。我从那里复制并粘贴在下面:

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

^{pr2}$

相关问题 更多 >

    热门问题