Python 如何更改空白字符的颜色?

Python 如何更改空白字符的颜色?,python,pyside2,qtextedit,Python,Pyside2,Qtextedit,我正在使用Qt和Python(PySide2)制作一个文本编辑器。像大多数其他文本编辑器一样,我希望创建可见的空白(空格、制表符、新行…)并成功。QTextEdit和QTextOption将空白字符显示为可见的特殊字符。(空格到点,制表符到箭头,新行到反向-P) 但这些特殊字符的颜色与其他字符相同。我想如果颜色不同,它会更容易阅读 如何更改空格特殊字符的颜色 orgText = """ \t\tAll those moments \t\twill be lost in time like

我正在使用Qt和Python(PySide2)制作一个文本编辑器。像大多数其他文本编辑器一样,我希望创建可见的空白(空格、制表符、新行…)并成功。QTextEdit和QTextOption将空白字符显示为可见的特殊字符。(空格到点,制表符到箭头,新行到反向-P)

但这些特殊字符的颜色与其他字符相同。我想如果颜色不同,它会更容易阅读

如何更改空格特殊字符的颜色

orgText = """
\t\tAll those moments
\t\twill be lost
  in time
  like tears
in rain.
       It's time to die."""
option = QtGui.QTextOption()
option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces | QtGui.QTextOption.ShowLineAndParagraphSeparators)
self.teOrg.setPlainText(orgText)
self.teOrg.document().setDefaultTextOption(option)

如果您想根据文本给出特殊提示,则应使用QSyntaxHighlighter。要执行此操作,必须获取模式的开始和结束,并使用
setFormat()
更改格式

我只能修改空格(
)和选项卡(
“\t”
)的格式,但不能修改段落分隔符(
):

重新导入
从PySide2导入QtCore、QtGui、QtWidgets
orgText=“”
\不要忘记那些时刻
\我会迷路的
及时
泪如雨下
在雨中。
是时候死了
类荧光灯(QtGui.QSyntaxHighlighter):
def uuu init uuu(self,parent=None):
超级(荧光灯,自我)。\uuuuu初始化\uuuuuuuuu(父级)
space_format=QtGui.QTextCharFormat()
space_format.setBackground(QtGui.QColor(“鲑鱼”))
tab_format=QtGui.QTextCharFormat()
tab_format.setBackground(QtGui.QColor(“浅灰色”))
self.highlightingRules=[
(r“()\1*”,空格_格式),
(r“(\t)\1*”,制表符格式),
]
def highlightBlock(自身,文本):
对于模式,在self.highlightingRules中使用fmt:
expression=re.compile(模式)
m=表达式。搜索(文本)
虽然m不是无:
开始,结束=m.span()
self.setFormat(开始,结束-开始,fmt)
m=表达式。搜索(文本,结束+1)
类MainWindow(QtWidgets.QMainWindow):
def uuu init uuu(self,parent=None):
超级(主窗口,自我)。\uuuuu初始化\uuuuuuu(父级)
self.teOrg=QtWidgets.QTextEdit()
self.setCentralWidget(self.teOrg)
self.teOrg.setPlainText(orgText)
option=QtGui.qtexoption()
option.setFlags(
QtGui.qtexoption.showtabsandspace
|QtGui.QTExtraption.ShowLine和段落分隔符
)
self.teOrg.document().setDefaultTextOption(选项)
self.highlighter=highlighter(self.teOrg.document())
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=主窗口()
w、 调整大小(320240)
w、 show()
sys.exit(app.exec_())

最后,我重写了@eyllanesc的代码

import sys
import typing
import re

from PySide2 import QtCore
from PySide2 import QtGui
from PySide2 import QtWidgets


class SyntaxHighlighter(QtGui.QSyntaxHighlighter):
  def __init__(self, parent:typing.Union[QtCore.QObject, QtGui.QTextDocument, None]=None):
    super().__init__(parent)
    self.spaceFmt = QtGui.QTextCharFormat()
    self.spaceFmt.setForeground(QtGui.QColor('red'))
    self.expression = re.compile(r'\s+', re.U | re.S | re.M)


  def highlightBlock(self, text:str):
    for match in self.expression.finditer(text):
      start, end = match.span()
      self.setFormat(start, end - start, self.spaceFmt)


class TextEditWin(QtWidgets.QMainWindow):
  def __init__(self):
    # Initialize ui.
    super().__init__()
    self.resize(800, 600)
    self.textEdit = QtWidgets.QTextEdit(self)
    self.setCentralWidget(self.textEdit)
    self.textEdit.setFontPointSize(15)

    # Make space characters visible.
    option = QtGui.QTextOption()
    option.setFlags(QtGui.QTextOption.ShowTabsAndSpaces | QtGui.QTextOption.ShowLineAndParagraphSeparators)
    self.textEdit.document().setDefaultTextOption(option)

    # Change color of space characters.
    self.highlighter = SyntaxHighlighter(self.textEdit.document())


if __name__ == '__main__':
  app = QtWidgets.QApplication(sys.argv)
  win = TextEditWin()
  win.show()
  sys.exit(app.exec_())
我的代码也不会更改段落分隔符(“”)的颜色。我认为这是因为当调用highlightBlock()时,Qt会传递除“\n”之外的文本


谢谢@eyllanesc。

谢谢您的回答!我已经尝试过使用正则表达式不改变颜色,而只是使空白可见。这种方法的缺点是速度慢。我正在寻找一种使用Qt内置功能的方法。@snoman这是Qt自己的功能,缺点是使用正则表达式,因此如果您想提高效率,请寻找正则表达式的替代品(我不是正则表达式专家,因此我的表达式可能不是最优的)