Как работать с "тяжелым" текстом QTextEdit?
Я хочу открыть .docx файл, в котором есть разные виды текста (жирный, курсив, подчеркнутый, разного цвета и т. п.), но после вывода файла в QTextEdit там пусто.
Думаю проблема в виджете, что он не может выводить такой вид.
import docx
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMenuBar, QMenu, QApplication, QFileDialog, QMainWindow, QAction, QMessageBox, QToolBar, QTextEdit
class Main(QMainWindow):
__doc = None
__text_edit = None
__file_path = None
__is_saved = False
__is_new = False
__file_name = None
def __init__(self):
super().__init__()
self.Window()
self.text_edit()
self.tool_bar()
self.menu_bar()
self.show()
def text_edit(self):
self.__text_edit = QTextEdit(self)
self.setCentralWidget(self.__text_edit)
def Window(self):
self.setWindowTitle("Vord")
self.resize(600, 400)
def tool_bar(self):
tool_bar = QToolBar("File", self)
self.addToolBar(tool_bar)
def menu_bar(self):
menu_bar = QMenuBar()
file = menu_bar.addMenu("Файл")
new_action = QAction("Новый", self)
new_action.triggered.connect(self.new)
new_action.setShortcut('Ctrl+N')
print(new_action)
open_action = QAction("Открыть", self)
open_action.triggered.connect(self.open)
open_action.setShortcut('Ctrl+O')
print(open_action)
exit_action = QAction("Выход", self)
exit_action.triggered.connect(self.exit)
exit_action.setShortcut('Alt+F4')
print(exit_action)
file.addAction(new_action)
file.addAction(open_action)
file.addAction(exit_action)
self.setMenuBar(menu_bar)
def open(self):
fname = QFileDialog.getOpenFileName(self, "Открыть", "G:/Docx", "Документ Microdoft Word(*.docx)")[0]
self.__file_path = fname
print(fname)
try:
__doc = docx.Document(fname)
all_paras = __doc.paragraphs
len(all_paras)
for para in all_paras:
self.__text_edit.setText(para.text)
except FileNotFoundError:
None
def new(self):
print(self.__is_saved)
if self.__is_saved:
self.__text_edit.setText("")
self.__is_new = True
else:
self.create_message()
def exit(self):
def closeEvent(self, e):
if self.__is_saved:
sys.exit(app.exec_())
else:
reply = QMessageBox.question(self, "Внимание",
"У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if reply == QMessageBox.No:
sys.exit(app.exec_())
elif reply == QMessageBox.Yes:
self.save()
elif reply == QMessageBox.Cancel:
e.ignore()
def create_message(self):
message = QMessageBox()
message.setIcon(QMessageBox.Information)
message.setWindowTitle("Внимание")
message.setText("У вас есть не сохраненные изменения в этом файле. Сохранить изменения?")
message.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if message.exec_() == QMessageBox.Yes:
self.save()
self.__text_edit.setText("")
if message.exec() == QMessageBox.No:
self.__text_edit.setText("")
def keyPressEvent(self, e):
k = e.key()
if k != 16777249:
self.__is_saved = False
def closeEvent(self, e):
if self.__is_saved:
sys.exit(app.exec_())
else:
reply = QMessageBox.question(self, "Внимание",
"У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if reply == QMessageBox.No:
sys.exit(app.exec_())
elif reply == QMessageBox.Yes:
self.save()
elif reply == QMessageBox.Cancel:
e.ignore()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
menus = Main()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант.
import docx
import win32com.client as win32 # !!! +++
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMenuBar, QMenu, QApplication, \
QFileDialog, QMainWindow, QAction, QMessageBox, QToolBar, \
QTextEdit
class Main(QMainWindow):
__doc = None # ???
__text_edit = None # ???
__file_path = None # ???
__is_saved = False # ???
__is_new = False # ???
__file_name = None # ???
def __init__(self):
super().__init__()
self.window()
self.text_edit()
self.tool_bar()
self.menu_bar()
def window(self):
self.setWindowTitle("Microdoft Word -> QTextEdit")
self.resize(600, 400)
def text_edit(self):
self.textEdit = QTextEdit(self)
self.setCentralWidget(self.textEdit)
def tool_bar(self):
tool_bar = QToolBar("File", self)
self.addToolBar(tool_bar)
def menu_bar(self):
menu_bar = QMenuBar()
file = menu_bar.addMenu("Файл")
new_action = QAction("Новый", self)
new_action.triggered.connect(self.new)
new_action.setShortcut('Ctrl+N')
# print(new_action)
open_action = QAction("Открыть", self)
open_action.triggered.connect(self.open)
open_action.setShortcut('Ctrl+O')
# print(open_action)
exit_action = QAction("Выход", self)
exit_action.triggered.connect(self.exit)
exit_action.setShortcut('Alt+F4')
# print(exit_action)
file.addAction(new_action)
file.addAction(open_action)
file.addAction(exit_action)
self.setMenuBar(menu_bar)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def open(self):
# ---------->v v
fname, _ = QFileDialog.getOpenFileName(
self,
"Открыть",
".", # "G:/Docx", установите свое
"Документ Microdoft Word(*.docx)")
self.__file_path = fname
print(fname, _) # +
if fname.endswith("docx"):
# Open MS Word
word = win32.gencache.EnsureDispatch('Word.Application')
doc = word.Documents.Open(fname)
# path to .html
txt_path = fname.split('.')[0] + '.html'
# wdFormatFilteredHTML has value 10
# сохраняет документ как html
doc.SaveAs(txt_path, 10)
doc.Close()
with open(txt_path, 'r') as f:
html = f.read()
self.textEdit.setHtml(html)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def new(self):
print(self.__is_saved)
if self.__is_saved:
self.textEdit.setText("")
self.__is_new = True
else:
self.create_message()
def exit(self):
def closeEvent(self, e):
if self.__is_saved:
sys.exit(app.exec_())
else:
reply = QMessageBox.question(
self,
"Внимание",
"У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel
)
if reply == QMessageBox.No:
sys.exit(app.exec_())
elif reply == QMessageBox.Yes:
self.save()
elif reply == QMessageBox.Cancel:
e.ignore()
def create_message(self):
message = QMessageBox()
message.setIcon(QMessageBox.Information)
message.setWindowTitle("Внимание")
message.setText("У вас есть не сохраненные изменения в этом файле. Сохранить изменения?")
message.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if message.exec_() == QMessageBox.Yes:
self.save()
self.textEdit.setText("")
if message.exec() == QMessageBox.No:
self.textEdit.setText("")
def keyPressEvent(self, e):
k = e.key()
if k != 16777249:
self.__is_saved = False
def closeEvent(self, e):
if self.__is_saved:
sys.exit(app.exec_())
else:
reply = QMessageBox.question(self, "Внимание",
"У вас есть не сохраненные изменения в этом файле. Сохранить изменения?",
QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
if reply == QMessageBox.No:
sys.exit(app.exec_())
elif reply == QMessageBox.Yes:
self.save()
elif reply == QMessageBox.Cancel:
e.ignore()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
w = Main()
w.show()
sys.exit(app.exec_())

