Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中显示同步渲染svg时出现问题_Python_Qt_Svg_Pyside_Sympy - Fatal编程技术网

在python中显示同步渲染svg时出现问题

在python中显示同步渲染svg时出现问题,python,qt,svg,pyside,sympy,Python,Qt,Svg,Pyside,Sympy,我有下面的程序,它使用sympy和svgmath来呈现用户的代数表达式。它几乎可以工作,但有几个问题: svg在程序退出之前不会实际生成,因此显然无法显示 有没有办法提高性能(不要每次都查找“svgmath.xml”等) 是否需要生成实际的svg文件?svgmath能否将输出直接传递给QSvgWidget 非常感谢并致以最良好的祝愿 from __future__ import division import sys import sympy from PySide.QtGui import

我有下面的程序,它使用sympy和svgmath来呈现用户的代数表达式。它几乎可以工作,但有几个问题:

  • svg在程序退出之前不会实际生成,因此显然无法显示
  • 有没有办法提高性能(不要每次都查找“svgmath.xml”等)
  • 是否需要生成实际的svg文件?svgmath能否将输出直接传递给QSvgWidget
  • 非常感谢并致以最良好的祝愿

    from __future__ import division
    import sys
    import sympy
    
    from PySide.QtGui import *
    from PySide.QtCore import *
    from PySide.QtXml import *
    from PySide.QtSvg import *
    
    from xml import sax
    from xml.sax.saxutils import XMLGenerator
    
    from svgmath.tools.saxtools import XMLGenerator, ContentFilter
    from svgmath.mathhandler import MathHandler, MathNS
    
    from sympy.printing.mathml import mathml
    from sympy.abc import x
    
    from sympy.utilities.mathml import c2p
    
    import libxml2
    
    import StringIO
    
    class Form(QDialog):
        def __init__(self, parent=None):
            super(Form, self).__init__(parent)
            self.browser = QTextBrowser()
            self.browser.setCurrentFont(QFont("Courier New",10,QFont.Bold))
            self.lineedit = QLineEdit("please type an expression")
            self.lineedit.selectAll()
            self.svgwidget = QSvgWidget()
            layout = QVBoxLayout()
            layout.addWidget(self.browser)
            layout.addWidget(self.lineedit)
            layout.addWidget(self.svgwidget)
            self.setLayout(layout)
            self.lineedit.setFocus()
            self.connect(self.lineedit, SIGNAL("textChanged (const QString&)"),self.updateUi)
    
        def updateUi(self):
            text = unicode(self.lineedit.text())
            for z in range(0,9):
                text = text.replace('x'+str(z),'x^'+str(z))
                text = text.replace(')'+str(z),')^'+str(z))
                text = text.replace(str(z)+'x',str(z)+'*x')
                text = text.replace(str(z)+'(',str(z)+'*(')
    
            try:
                prettytext = sympy.printing.pretty(sympy.sympify(text))
                self.browser.clear()
                self.browser.append(prettytext)
    
                # Open all files
                output = open("test.svg", "w")
                config = open("svgmath.xml", "r")
    
                # Create the converter as a content handler. 
                saxoutput = XMLGenerator(output, 'utf-8')
                handler = MathHandler(saxoutput, config)
    
                # Parse input file with a namespace-aware SAX parser
                parser = sax.make_parser()
                parser.setFeature(sax.handler.feature_namespaces, 1)
                parser.setContentHandler(handler)
                parser.parse(StringIO.StringIO(c2p(mathml(sympy.sympify(text)), simple=True)))
                self.svgwidget.load("test.svg")
    
            except Exception:
                if text=='': self.browser.clear()
    
        app = QApplication(sys.argv)
    form = Form()
    form.show()
    app.exec_()
    

    您应该关闭文件句柄,否则写入的数据可能尚未刷新到文件系统

    parser.parse()
    output.close()
    
    或者,将
    表达式一起使用

    with open("test.svg", "w") as output:
        ...
        parser.parse()
    load()
    
    是否需要生成实际的svg文件


    我认为
    QSvgWidget
    提供了一个
    load
    插槽,它使用一个带有文件内容的字节字符串

    再次感谢!我将试一试。output.close()命令非常有效-谢谢!您认为有没有一种方法不必每次都加载“svgmath.xml”呢?(我认为这会提高绩效)。另外,如何让svgmath生成字节字符串?再次感谢!我从未使用过PyQt,但根据文档(),您需要传入一个
    QByteArray
    ,它可能提供一个获取
    str
    字节
    对象的命令。对于配置文件:我快速查看了
    svgmath
    的源代码。遗憾的是,我没有找到一种内置的方法来重用配置文件。但是如果您查看
    mathhandler.py:mathhandler:\uuuu init\uuuu
    ,修复该问题并重用
    MathConfig
    实例应该不会太困难。好的,谢谢!我有点不知所措(我只是一个谦逊的数学老师),但我非常感谢你这几天的帮助。我会研究并考虑你的最新建议。一句话——我非常高兴它能工作!