У меня есть программа для написания текста, и когда я нажимаю кнопку «Компиляция», она компилируется в латекс, преобразуется в pdf и отображается в моем приложении. Проблема в том, что когда у меня возникает ошибка компиляции, приложение выдает ошибку и все. Я хотел бы знать, возможно ли восстановить ошибки компиляции без сбоя приложения. Я пробовал с попыткой / ожиданием, но это не ошибка python, поэтому она не работает.
Вам понадобится PDF. js для просмотра PDF https://mozilla.github.io/pdf.js/getting_started/#download
Ui:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(841, 481)
self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
self.horizontalLayout.setObjectName("horizontalLayout")
self.gridLayout = QtWidgets.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.textEdit = QtWidgets.QTextEdit(Dialog)
self.textEdit.setMinimumSize(QtCore.QSize(0, 200))
self.textEdit.setObjectName("textEdit")
self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 1)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Vertical)
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
self.buttonBox.setObjectName("buttonBox")
self.gridLayout.addWidget(self.buttonBox, 0, 1, 1, 1)
#self.textEdit_2 = QtWidgets.QTextEdit(Dialog)
#self.textEdit_2.setObjectName("textEdit_2")
#self.gridLayout.addWidget(self.textEdit_2, 1, 0, 1, 1)
self.horizontalLayout.addLayout(self.gridLayout)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept)
self.buttonBox.rejected.connect(Dialog.reject)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
приложение:
import os
import sys
from PyQt5.QtWidgets import QDialog, QPushButton, QWidget, QApplication
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
from sympy import Symbol
import untitled
x=Symbol('x')
class Test(QDialog, untitled.Ui_Dialog):
def __init__(self):
super(Test, self).__init__()
self.setupUi(self)
self.bouton= QPushButton('compile',self)
self.horizontalLayout.addWidget(self.bouton)
self.bouton.clicked.connect(self.crertest)
self.widget = QWidget(self)
self.gridLayout.addWidget(self.widget, 1, 0, 1, 1)
self.t = Window()
lay = QtWidgets.QVBoxLayout(self.widget)
lay.addWidget(self.t)
def crertest(self):
try :
def preambule(*packages):
p = ""
for i in packages:
p = p + "\\usepackage{" + i + "}\n"
return p
start = "\\documentclass[12pt,a4paper,french]{article}\n\\usepackage[utf8]{inputenc}\n"
start = start + preambule('amsmath','graphicx')
start = start + "\\begin{document}\n"
end = "\\end{document}"
body = self.textEdit.toPlainText()
container = start + body + end
file = "mypdf.tex"
if os.path.exists(file):
os.remove(file)
fichier = open("mypdf.tex", "x") #
fichier.write(container)
fichier.close()
instructions = "pdflatex " + file
os.system(instructions)
readpdf = "START " + file[:-4] + ".pdf"
self.t.loadd()
except:
print('Fail')
PDFJS = 'file:///C:/Users/pdf_js/web/viewer.html' #Path too viewer.htlm in your pddf_js folder
PDF = 'file:///C:/Users/mypdf.pdf' #Path to your pdf
class Window(QtWebEngineWidgets.QWebEngineView):
def __init__(self):
super(Window, self).__init__()
self.loadd()
try:
def loadd(self):
self.load(QtCore.QUrl.fromUserInput('%s?file=%s' % (PDFJS, PDF)))
except:
print ('Fail 2')
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Test()
main.show()
app.exec_()
Я использую код, взятый из этого поста для отображения PDF: Как отобразить PDF с помощью PDF. js Просмотрщик в PyQt?
Точно так же, как редактор латекса, как Texmaker.
Edit.
Я поставил часть Программа, которая компилируется в латекс и отображает PDF в другом модуле.
Я вызываю модуль в моем основном файле, за исключением того, что мне приходится дважды компилировать программу, чтобы получить обновление дисплея. Иногда после компиляции 3/4 появляется ошибка. Мне нужно что-то добавить, чтобы запустить его один раз?
compile: test.py
import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
TMP_DIR = os.path.join(CURRENT_DIR, "tmp")
PDFJS = os.path.join(CURRENT_DIR, "3rdParty/pdfjs-2.2.228-dist/web/viewer.html")
def create_document(content, packages):
lines = (
r"\documentclass[12pt,a4paper,french]{article}",
r"\usepackage[utf8]{inputenc}",
*(r"\usepackage {%s}" % (package,) for package in packages),
r"\begin{document}",
content,
r"\end{document}",
)
return "\n".join(lines)
class PdfViewer(QtWebEngineWidgets.QWebEngineView):
def load_pdf(self, filename):
url = QtCore.QUrl.fromUserInput(
"%s?file=%s" % (QtCore.QUrl.fromLocalFile(PDFJS).toString(), filename)
)
self.load(url)
class Compile:
def __init__(self, parent):
super().__init__()
self.process = QtCore.QProcess(parent)
self.process.readyReadStandardOutput.connect(self.on_readyReadStandardOutput)
self.process.finished.connect(self.on_finished)
self.process.setProgram("pdflatex")
self.basename = "mypdf"
def compile(self,body):
doc = create_document(body, ("amsmath", "graphicx"))
QtCore.QDir().mkpath(TMP_DIR)
self.qfile = QtCore.QFile(os.path.join(TMP_DIR, self.basename + ".tex"))
if self.qfile.open(QtCore.QIODevice.WriteOnly):
self.qfile.write(doc.encode())
self.qfile.close()
self.process.setArguments(
[
"-interaction=nonstopmode",
"-jobname={}".format(self.basename),
"-output-directory={}".format(TMP_DIR),
self.qfile.fileName(),
]
)
self.process.start()
def on_readyReadStandardOutput(self):
print(self.process.readAllStandardOutput().data().decode(), end='')
def on_finished(self):
self.qfile.remove()
вызов с:
import os
from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
import test
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.input = QtWidgets.QTextEdit()
self.input.setText('.')
self.a = test.Compile(self)
self.a.compile('.')
self.b = test.PdfViewer()
self.b.load_pdf(your PDF path)
compile_button = QtWidgets.QPushButton(self.tr("Compile"))
lay = QtWidgets.QGridLayout(self)
lay.addWidget(compile_button, 0, 0, 1, 2)
lay.addWidget(self.input, 1, 0)
lay.addWidget(self.b, 1, 1)
lay.setColumnStretch(0, 1)
lay.setColumnStretch(1, 1)
compile_button.clicked.connect(self.call)
def call(self):
self.a.compile(self.input.toPlainText())
self.b.load_pdf(your PDF path)
def main():
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.showMaximized()
sys.exit(app.exec_())
if __name__ == "__main__":
main()