在 PyQt 中(很好地)显示代数表达式 [重复]

2023-11-27

在我的 python 程序中,有一个我创建的数学对象的层次结构,它们代表数学公式。
例如,有Collection,这是一系列Equations,这是一个包含两个的容器Sums, Products, Quotients, Exponants or 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、图像等。

  • 起初,我考虑过 MathML,但了解到 PyQt 在显示 HTML 时忽略 MathML 标签,并且曾经存在用于此确切任务的 QMmlWidget,但已被弃用。
  • 然后我读到了以下内容的组合sympy, svgmath and QSvgWidget有效,将公式显示为 Svgs,但我需要我的代码是可分发的,而设置 svgmath 时的字体配置内容会抑制这一点。
  • 我认为这看起来很有希望:显示与终端一致的 LaTeX 方程但视频总时长将近4个小时,我没有耐心。

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

非常感谢任何和所有的帮助!
Thanks!


来自博客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_())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PyQt 中(很好地)显示代数表达式 [重复] 的相关文章

随机推荐

  • 在 data.table 列中使用列表

    In data table可能有类型的列list我第一次尝试从这个功能中受益 我需要存储表的每一行dt一些来自 rApache Web 服务的评论 每个评论都会有一个用户名 日期时间和正文项 不要使用带有一些奇怪 不寻常的字符的长字符串来将
  • Android + OpenCV:使用CameraBridgeViewBase时如何设置相机分辨率

    您好 我正在使用 OpenCV4Android 人脸检测示例 我想知道如何获得相机的分辨率并将其设置为其他值 在此示例中 CameraBridgeViewBase 我在对象上看到了这一点 private CameraBridgeViewBa
  • 如何修复 python socket-io 服务器中的“Access-Control-Allow-Origin”错误

    我正在创建一个使用 Vue js 作为客户端 和 Python 作为服务器 的项目 Python用于一些计算 Vue js用于接口 我使用 python socketio 连接它们 https python socketio readthe
  • java中ArrayList的排序

    我有一个 ArrayList of String 的 ArrayList 在 Outer ArrayList 的每个索引上 每个 Inner ArrayList 有四个项目 有四个参数 联系人 ID 联系人姓名 联系地址 联系电话 现在我想
  • Telegram 机器人向机器人发送消息

    我编写了一个电报机器人 这在发送给群组或用户时效果很好 不过我有一个特殊的要求 我需要能够发送给另一个机器人 将两个机器人以管理员身份添加到组时 我仍然无法通过第二个机器人接收消息 我只能通过添加到该组的真实用户帐户看到它 我缺少什么 我使
  • Linux命令用另一个字符串替换大文件中的字符串

    我有一个巨大的 SQL 文件在服务器上执行 转储来自我的机器 其中有一些与我的机器相关的设置 所以基本上 我希望每次出现 c temp 被替换为 home some blah 如何从命令行完成此操作 sed对于大文件来说是一个不错的选择 s
  • MYSQL:如何找到“上周一的日期”(性能问题)

    有没有比写更简单的方法 select date sub curdate 间隔 WEEKDAY curdate 天 正如上周一从双 如果您不使用古老的 MySQL 则可以将其包装在存储函数中 CREATE FUNCTION LastMonda
  • rgdal 包纬度/经度 -> UTM

    有人能看出这有什么问题吗 library rgdal Make a two column matrix col1 long col2 lat xy lt cbind c 107 c 26 Convert it to UTM coordina
  • 使用 Numpy 和 Cython 加速距离矩阵计算

    考虑一个维度为 NxM 的 numpy 数组 A 目标是计算欧几里德距离矩阵 D 其中每个元素 D i j 是行 i 和 j 之间的欧几里德距离 最快的方法是什么 这并不完全是我需要解决的问题 但它是我正在尝试做的事情的一个很好的例子 一般
  • 从电子邮件提交表格

    我正在开发一个通过电子邮件提交表单的项目 场景是这样的 我们将向电子邮件列表发送一份表格 客户必须在其中填写表格 一旦他们点击 提交 就应该提交表格 并且服务器应该能够检索填写者提供的值 当我尝试过 它没有将提交按钮视为表单提交 并且没有执
  • 在关系数据库中,我们可以拥有一个与其他表没有任何关系的表吗?

    在关系数据库中 我们可以拥有一个与其他表没有任何关系的表吗 是的 关系的表达方式是使用外键 如果您生成的表没有外键 并且其他表中没有外键指向该表 则它没有关系 不过 以后仍然可以建立关系 所以不要担心搬起石头砸自己的脚
  • 如何访问R中传单生成的地图

    假设我有这样的代码 Install devtools if needed if require devtools install packages devtools view rawif devtools R hosted with by
  • 如何在 git 中设置临时存储库?

    我想创建一个存储库 B 在名为 x master 的分支中跟踪远程存储库的主服务器 A 它自己的主控在初始创建时也应该是一个克隆 其他 开发人员 可以克隆并将更改推送到其中 有时 由于 A 中有更改 我需要能够将它们拉下来并将它们合并到 B
  • std::ifstream 缓冲区缓存

    在我的应用程序中 我试图合并排序的文件 当然要保持它们排序 因此我必须迭代两个文件中的每个元素 以将最小值写入第三个文件 这在大文件上运行得相当慢 因为我没有看到任何其他选择 必须完成迭代 我正在尝试优化文件加载 我可以使用一定量的 RAM
  • SQL CTE 和 ORDER BY 影响结果集

    我在下面粘贴了一个非常简化的 SQL 查询版本 我遇到的问题是ORDER BY语句正在影响我的 CTE 的选择结果 我一直无法理解为什么会这样 我最初的想法是在 CTE 中 我执行了一些SELECT声明 然后ORDER BY应该致力于那些结
  • Kotlin 协程中的 launch/join 和 async/await 有什么区别

    In the kotlinx coroutines库 您可以使用以下任一方式启动新的协程launch with join or async with await 它们之间有什么区别 launch习惯于即发即忘协程 这就像开始一个新线程 如果
  • imap_unordered,但带有惰性扁平生成器

    我有一个已经可以解决的问题multiprocessing Pool但解决方案并不是非常理想 也就是说 我拥有一组相当小的输入 每个输入都映射到一个大数据集 虽然我可以使用imap unordered对于返回列表的函数 这远非高效 因为每个大
  • PHP 生成的 csv 文件在 Excel 2007 中显示英镑符号 (£) 的 £

    我使用以下标头命令生成 csv 文件 header Content type text csv charset utf 8 encoding utf 8 header Content Disposition attachment filen
  • 32 位系统上的 Java 10(及更高版本)

    据我所知 oracle 没有计划为 32 位提供 java 但也许我误解了情况 如果我是对的 如果我们需要支持 32 位库 dll 我们该怎么办 那么 32 位操作系统又如何呢 目前这似乎对未来产生巨大影响 但正如我所说 也许我错了 事实上
  • 在 PyQt 中(很好地)显示代数表达式 [重复]

    这个问题在这里已经有答案了 在我的 python 程序中 有一个我创建的数学对象的层次结构 它们代表数学公式 例如 有Collection 这是一系列Equations 这是一个包含两个的容器Sums Products Quotients