Попытка произвести моноширинный вывод в браузере pyqt - PullRequest
2 голосов
/ 03 ноября 2010

Я изменил короткий кусок кода 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_()

Ответы [ 2 ]

3 голосов
/ 03 ноября 2010

Вы должны быть в состоянии изменить шрифт с помощью setFontFamily.

По поводу вашего кода: я еще не работал с PyQt (только некоторые хаки, такие как семейство шрифтов в qbzr ...), поэтому я не могу сказать вам, все ли в порядке. Но следующее не очень хорошая идея:

    except:
        if text=='': self.browser.clear()
  1. Никогда не перехватывайте все исключения с except:. Это также поймает BaseException s как SystemExit, что не должно быть поймано, если у вас нет причины для этого. Всегда перехватывайте определенные исключения или если вы находитесь на самом высоком уровне (до выполнения обработчика необработанных исключений) и хотите регистрировать ошибки, лучше используйте except Exception:, который будет обрабатывать только исключения, основанные на Exception.
  2. if text=='' - я думаю if not text более "питон".
1 голос
/ 03 ноября 2010

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.

Второй шаблон ищет переменную az или закрывающую скобку [a-z]|[\)], за которой следуют одна или несколько цифр \d+.Он использует групповые скобки, чтобы снова захватить цифру и переменную, и вставляет между ними ^ \1^\2.

Это не совсем идеально (не обрабатывает xy --> x*y), но ближе к нему.Если вы хотите создать полноценную систему компьютерной алгебры, вам, вероятно, потребуется создать специальный синтаксический анализатор:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...