2

ユーザーの表現をリアルタイムでレンダリングするために、短い pyqt コードを修正しました。これには sympy のプリティ印刷機能を使用しましたが、QTextBrowser が等幅フォントではなくプロポーショナル フォントを使用しているため、出力が正しく表示されません。

初心者として、コードに関するその他の考えも歓迎します。

多くの感謝と最高の願い、ゲデス

from __future__ import division
import sys
import sympy
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class Form(QDialog):
    def __init__(self, parent=None):
        super(Form, self).__init__(parent)
        self.browser = QTextBrowser()
        self.lineedit = QLineEdit("please type an expression")
        self.lineedit.selectAll()
        layout = QVBoxLayout()
        layout.addWidget(self.browser)
        layout.addWidget(self.lineedit)
        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:
            self.browser.append(sympy.printing.pretty(sympy.sympify(text)))
            self.browser.clear()
            self.browser.append(sympy.printing.pretty(sympy.sympify(text)))
        except:
            if text=='': self.browser.clear()

app = QApplication(sys.argv)
form = Form()
form.show()
app.exec_()
4

2 に答える 2

3

でフォントを変更できるはずですsetFontFamily

あなたのコードに関して: 私はまだ PyQt を実際に扱っていません (qbzr のフォント ファミリーのようないくつかのハックだけです...)。ただし、次のことはお勧めできません。

    except:
        if text=='': self.browser.clear()
  1. ですべての例外をキャッチしないでくださいexcept:。これはBaseExceptionのような sもキャッチSystemExitしますが、そうする理由がない限りキャッチされるべきではありません。常に特定の例外をキャッチするか、最高レベル (未処理の例外ハンドラーが実行される前) にいてエラーをログに記録したい場合は、にexcept Exception:基づいて例外のみを処理する which を使用しExceptionます。
  2. if text==''if not text-もっと「pythonic」だと思います。
于 2010-11-03T20:37:54.600 に答える
1

QTextBrowser は QTextEdit を継承しているため、このsetCurrentFont(QFont)メソッドを使用して等幅フォントを設定できます。

self.browser = QTextBrowser()
self.browser.setCurrentFont(QFont("Courier New")) #Or whatever monospace font family you want...

スタイルに関する一般的なコメントについては、おそらくテキスト置換updateUi()を正規表現に変更する方法があると思いますが、サンプル データを見て何をしようとしているのかを理解しないと確信が持てません。

また、おそらくリファクタリングする必要があります

try:
    self.browser.append(sympy.printing.pretty(sympy.sympify(text)))
    self.browser.clear()
    self.browser.append(sympy.printing.pretty(sympy.sympify(text)))
except:
    if text=='': self.browser.clear()

もっと似たものに:

self.browser.clear()
try:
    self.browser.append(sympy.printing.pretty(sympy.sympify(text)))
except:
    if text=='': self.browser.clear()

おそらく、期待している実際の例外をキャッチすることを除いて。

編集 これは、あなたがやろうとしているように見える正規化方程式の何かです。小文字のazと実数で動作します:

def updateUi(self):
    text = unicode(self.lineedit.text())
    text = re.sub(r'(\d+)([\(]|[a-z])',r'\1*\2',text) #for multiplication
    text = re.sub(r'([a-z]|[\)])(\d+)',r'\1^\2',text) #for exponentiation

最初のパターンは、1 つ以上の数字\d+とその後に続く開き括弧、または単一の文字 azを探し[\(]|[a-z]ます。括弧を使用してパターンの数字部分とパターンの変数部分をキャプチャし、それらの間に * を挿入します。\1*\2.

2 番目のパターンは、変数 az または右括弧[a-z]|[\)]の後に 1 つ以上の数字が続くものを探します\d+。グループ化括弧を使用して数字と変数を再度キャプチャし、それらの間に ^ を挿入します\1^\2

完璧ではありません ( を処理しませんxy --> x*y) が、それに近いものです。完全なコンピューター代数システムを作成したい場合は、おそらく専用のパーサーを作成する必要があります:)

于 2010-11-03T20:37:31.700 に答える