我有一个编写文本的程序,当我单击“编译”按钮时,它会编译为 latex,转换为 pdf 并将其显示在我的应用程序上。问题是,当我遇到编译错误时,应用程序就会出错,仅此而已。我想知道是否有可能在应用程序不崩溃的情况下恢复编译错误。我尝试使用 try/expect,但这不是 python 错误,所以它不起作用。
您需要 PDF.js 来查看 pdfhttps://mozilla.github.io/pdf.js/getting_started/#download
用户界面:
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 显示:https://stackoverflow.com/questions/23389001/how-to-render-pdf-using-pdf-js-viewer-in-pyqt
instructions = "pdflatex " + file
此行编译,但我无法捕获错误
答案1
好吧,这个问题可能有点跑题,而且我的评论作为评论也很难让人接受。所以,请认真考虑我的回答。
我想知道是否有可能在应用程序不崩溃的情况下恢复编译错误。
新语言提供的常见方法是使用try-catch
机制,即抛出异常,尝试修复或处理错误。有关 Phyton 的基本入门,请参见此处:https://www.w3schools.com/python/python_try_except.asp。
当你说它不是 时Phyton error
,它肯定会在命令行上显示错误消息。因此,应该做的是将编译命令提交到 shell(即提交系统调用、DOS、bash 等等),读回并将这些结果置于 try-catch 机制之下。
当我点击“编译”按钮时,它会编译为 latex,转换为 pdf 并将其显示在我的应用程序上。问题是,当我遇到编译错误时,应用程序就会出现错误,仅此而已。
这通常是您在进行直接编程时获得的指纹或模式。放慢速度将恢复速度……当您应用时test-driven-design paradigm
。即对于您可能想要使用的任何功能,您在实施之前已经对其进行了测试;-)
实际上,你可以这样做unit testing
。例如参见此处:https://docs.python.org/3/library/unittest.html。您的回报将是,例如,优美的代码、将焦点从代码转移到测试本身、可重用性等等。
测试 (G)UI 可能很痛苦。你越能根据概念将表示(GUI、处理输入和输出的 UI)与功能(它实际做什么)区分开来,你就越能走上正轨。