在WORD中显示代码的格式

  


v0.0

使用pygments+Tkinter,本来想打开软件后,将代码粘到左边,然后点一下按钮,右边就出来格式,但最后使用的html的格式,我找了一下午也没找到tkinter怎么内嵌一个html,所以就直接打开一个网页吧,然后在全选粘贴到word里。

v0.1

修改了一下,从gui从Tkinter换成PyQt5,可以更方便的显示html


 现在不太好用,先拿这个顶着

在需要格式化的代码的文件夹下,打开cmd,键入

pygmentize -O full,style=friendly -o test.html test.py

 然后再去html里复制出来


在word中粘贴代码时,经常无法像多数IDE那样带着格式显示,本文利用pygments+PyQt5将代码带格式显示出来,达到以下的效果

 

待改进的地方:

1,有行号的时候,第一行总对不齐。而且最后一行会多出来一行?????

2, 目前就只加了C和Python,别的语言我也不会...

3, 在word里粘贴的时候,要注意下粘贴的格式。

先这样,

代码如下,直接编译就好

# -*- coding: utf-8 -*-
import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QRect, QCoreApplication
from PyQt5.QtWebEngineWidgets import QWebEngineView
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter
from pygments.styles import STYLE_MAP
# import pyperclip


def transfer(code, lineno=False, style='friendly',ulexer='C',):
	# 准备好格式
	lexer = get_lexer_by_name(ulexer)
	# print(lexer)
	css = HtmlFormatter(style=style).get_style_defs()
	css = css + "\n.highlighttable { border: 1px solid #ddd; background-color: #f0f0f0; padding-left: 10px; " \
				"width:600px} "
	css = css + "\n."+ style + "table { border: 1px solid #ddd; background-color: #f0f0f0; padding-left: 10px; " \
				"width:600px} "
	if lineno:
		css = css + "\n.linenodiv { padding-right: 10px}"
	# print(css)
	with open("style.css", 'w', encoding='utf-8') as s:
		s.write(css)
	formatter = HtmlFormatter(linenos=lineno, style=style, cssclass=style)
	tmp_result = highlight(code, lexer, formatter)
	css_html = '<style type="text/css">' + css + '</style>'
	if not lineno:
		tmp_result = "<table class='highlighttable'><tbody><tr><td>" + tmp_result + "<td></tr></tbody" \
																					"></table> "
	result = "<html>" + css_html + tmp_result + "</html>"
	return result


class Ui_MainWindow(object):
	def __init__(self):
		self._style = None
		self._lineno = False
		self._lexer = 'C'

	def setupUi(self, MainWindow):
		MainWindow.setObjectName("MainWindow")
		MainWindow.resize(640, 512)
		# MainWindow.setWindowIcon(QtGui.QIcon("biao.ico"))
		self.centralwidget = QtWidgets.QWidget(MainWindow)
		self.centralwidget.setObjectName("centralwidget")

		# browser config
		self.browser = QWebEngineView(self.centralwidget)
		self.browser.setGeometry(QtCore.QRect(325, 42, 300, 450))

		# about_button config
		self.about_button = QtWidgets.QPushButton(self.centralwidget)
		self.about_button.setGeometry(QtCore.QRect(580, 10, 50,23))
		self.about_button.setObjectName("About")
		self.about_button.clicked.connect(self.about_event)

		# Yes button config
		self.Yes_button = QtWidgets.QPushButton(self.centralwidget)
		self.Yes_button.setGeometry(QtCore.QRect(15, 10, 75, 23))
		self.Yes_button.setObjectName("Transfer!")
		self.Yes_button.clicked.connect(self.transfer_event)

		# style_combobox config
		self.style_combobox = QtWidgets.QComboBox(self.centralwidget)
		self.style_combobox.setGeometry(QtCore.QRect(100, 10, 150, 23))
		self.style_combobox.setObjectName("style")
		#self.style_combobox.addItem("Choose a style")
		for k in STYLE_MAP.keys():
			self.style_combobox.addItem(k)
		self.style_combobox.activated.connect(self.stylechange_event)

		# lexer_combobox config
		self.lexer_combobox = QtWidgets.QComboBox(self.centralwidget)
		self.lexer_combobox.setGeometry(QtCore.QRect(260, 10, 100, 23))
		self.lexer_combobox.setObjectName("lexer")
		self.lexer_combobox.addItem("C")
		self.lexer_combobox.addItem("Python")
		self.lexer_combobox.activated.connect(self.lexerchange_event)

		# check_box config
		self.lineno_checkbox = QtWidgets.QCheckBox("Line No.", self.centralwidget)
		self.lineno_checkbox.setGeometry(QtCore.QRect(400, 10, 80, 23))
		self.lineno_checkbox.setObjectName("check_box")
		self.lineno_checkbox.stateChanged.connect(self.lineno_event)

		# input_text config
		self.input_text = QtWidgets.QTextEdit(self.centralwidget)
		self.input_text.setGeometry(QtCore.QRect(15, 42, 300, 450))
		self.input_text.setObjectName("input_text")
		self.input_text.textChanged.connect(self.textchanged_event)

		MainWindow.setCentralWidget(self.centralwidget)
		self.menubar = QtWidgets.QMenuBar(MainWindow)
		self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 23))
		self.menubar.setObjectName("menubar")
		MainWindow.setMenuBar(self.menubar)

		self.statusbar = QtWidgets.QStatusBar(MainWindow)
		self.statusbar.setObjectName("statusbar")
		MainWindow.setStatusBar(self.statusbar)

		self.retranslateUi(MainWindow)
		QtCore.QMetaObject.connectSlotsByName(MainWindow)

	def retranslateUi(self, MainWindow):
		_translate = QtCore.QCoreApplication.translate
		MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
		self.Yes_button.setText(_translate("MainWindow", "Transfer"))
		self.about_button.setText(_translate("MainWindow", "About"))

	# self.No_button.setText(_translate("MainWindow", "No"))

	def transfer_event(self):
		print("transfer")
		self.content = self.input_text.toPlainText()
		if self._style in STYLE_MAP.keys():
			code = transfer(self.content, self._lineno, self._style, self._lexer)
			self.browser.setHtml(code)

	def textchanged_event(self):
		print("text changed!")
		self.content = self.input_text.toPlainText()
		if self._style in STYLE_MAP.keys():
			code = transfer(self.content, self._lineno, self._style, self._lexer)
			self.browser.setHtml(code)

	def stylechange_event(self):
		print("style changed!")
		self._style = self.style_combobox.currentText()
		self.content = self.input_text.toPlainText()
		if self._style in STYLE_MAP.keys():
			code = transfer(self.content, self._lineno, self._style, self._lexer)
			self.browser.setHtml(code)

	def lineno_event(self):
		if self.lineno_checkbox.isChecked():
			self._lineno = True
		else:
			self._lineno = False
		self.content = self.input_text.toPlainText()
		if self._style in STYLE_MAP.keys():
			code = transfer(self.content, self._lineno, self._style, self._lexer)
			self.browser.setHtml(code)
		with open("test.html", 'w', encoding='utf-8') as f:
			f.write(code)

	def lexerchange_event(self):
		self._lexer = self.lexer_combobox.currentText()
		self.content = self.input_text.toPlainText()
		if self._style in STYLE_MAP.keys():
			code = transfer(self.content, self._lineno, self._style, self._lexer)
			self.browser.setHtml(code)

	def about_event(self):
		about = QtWidgets.QMessageBox.about(self.centralwidget, 'About', "Auth:\tSean\nEmail:\tgx3271@163.com")
		print("about!")

if __name__ == '__main__':
	app = QtWidgets.QApplication(sys.argv)
	mainWindow = QtWidgets.QMainWindow()
	window = Ui_MainWindow()
	window.setupUi(mainWindow)
	mainWindow.show()
	sys.exit(app.exec_())  # 运行程序

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值