python - 如何自动替换在 QtPlainTextEdit 小部件中键入的字符
问题描述
这是我第一次使用PyQt5
它,它也非常好,所以我用它构建了一个类似的文本编辑器,我想用QtPlainTextEdit
. 实际上我想做的就是这个网站所做的事情:lexilogos.com/keyboard/sinhala.htm
在这个网站上,他们有一个简单的文本区域,当我们输入时,它只是用僧伽罗字符替换每个英文字符,当然是以一种有意义的方式。所以我需要对 python-qt5 做同样的事情。
我的代码:
Save New Duplicate & Edit Just Text Twitter
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'design.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QFont
from main import Execute
import sys
#from PyQt5.Qt import Qt
class Ui_MainWindow(object):
def selectionchange(self, index):
return i
def code_run(self):
text = self.code_input.document().toPlainText()
result, error = Execute('<stdin>', text)
if error:
print(error.as_string())
self.result.setPlainText(error.as_string())
elif result:
if len(result.elements) == 1:
print(repr(result.elements[0]))
_printed_ = open('_printed_','r').read()
if _printed_ != None or '':
self.result.setPlainText(_printed_)
else:
self.result.setPlainText(repr(result.elements[0]))
else:
print(repr(result))
if _printed_ != None or '':
_printed_ = open('_printed_','r').read()
self.result.setPlainTexbt(_printed_)
else:
self.result.setPlainText(repr(result))
def font_sizer(self):
size = self.font_size_increaser.value()
self.font_size.setText(f"Font size: {size}")
self.code_input.setFont(QFont("UN Abhya Bold",size))
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(737, 568)
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setBold(True)
font.setItalic(True)
font.setWeight(75)
MainWindow.setFont(font)
self.centralwidget = QtWidgets.QWidget(MainWindow)
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setBold(True)
font.setItalic(True)
font.setWeight(75)
self.centralwidget.setFont(font)
self.centralwidget.setObjectName("centralwidget")
self.run = QtWidgets.QPushButton(self.centralwidget)
self.run.setGeometry(QtCore.QRect(20, 450, 121, 41))
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setPointSize(12)
font.setBold(True)
font.setItalic(False)
font.setWeight(75)
self.run.setFont(font)
self.run.setObjectName("run")
self.run.clicked.connect(self.code_run)
self.font_size_increaser = QtWidgets.QSlider(self.centralwidget)
self.font_size_increaser.setGeometry(QtCore.QRect(250, 460, 221, 19))
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setBold(True)
font.setItalic(False)
font.setWeight(75)
self.font_size_increaser.setFont(font)
self.font_size_increaser.setOrientation(QtCore.Qt.Horizontal)
self.font_size_increaser.setObjectName("font_size_increaser")
self.font_size_increaser.valueChanged.connect(self.font_sizer)
self.font_size = QtWidgets.QLabel(self.centralwidget)
self.font_size.setGeometry(QtCore.QRect(340, 440, 91, 16))
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setPointSize(10)
font.setBold(False)
font.setItalic(True)
font.setWeight(75)
self.font_size.setFont(font)
self.font_size.setObjectName("font_size")
self.code_input = QtWidgets.QPlainTextEdit(self.centralwidget)
self.code_input.setGeometry(QtCore.QRect(10, 10, 461, 421))
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setPointSize(15)
font.setBold(True)
font.setItalic(False)
font.setWeight(75)
self.code_input.setFont(font)
self.code_input.setObjectName("code_input")
self.language = QtWidgets.QComboBox(self.centralwidget)
self.language.setGeometry(QtCore.QRect(540, 450, 151, 22))
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setBold(True)
font.setItalic(False)
font.setWeight(75)
self.language.setFont(font)
self.language.setObjectName("language")
lang = open("_languages.lang","r").read().splitlines()
self.language.addItems(lang)
self.language.currentIndexChanged.connect(self.selectionchange)
self.result = QtWidgets.QPlainTextEdit(self.centralwidget)
self.result.setGeometry(QtCore.QRect(490, 10, 231, 421))
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setPointSize(12)
font.setBold(True)
font.setItalic(True)
font.setWeight(75)
self.result.setFont(font)
self.result.setObjectName("result")
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
font = QtGui.QFont()
font.setFamily("UN Abhya Bold")
font.setBold(True)
font.setItalic(True)
font.setWeight(75)
self.statusbar.setFont(font)
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.run.setText(_translate("MainWindow", "RUN"))
self.font_size.setText(_translate("MainWindow", "Font Size"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
我认为为了实现这一点,我需要不断听取输入的所有字符,首先将先前字符的副本复制到变量中,然后替换当前字符并将它们连接在一起,还是有其他方法?我不知道如何用这些小部件和所有方法做到这一点。
解决方案
一种可能的解决方案是修改 QKeyEvent:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeyEvent
from PyQt5.QtWidgets import QApplication, QPlainTextEdit
KEYS_MAPPING = {
"a": "අ",
"b": "බ්",
"c": "දෙ",
"d": "ෆ්",
"e": "ග්",
"f": "ෆ්",
"g": "ඝි",
"h": "ජ්",
"i": "ක්",
}
class TextEdit(QPlainTextEdit):
def keyPressEvent(self, event):
event = self.change_letter(event)
super().keyPressEvent(event)
def change_letter(self, event):
text = KEYS_MAPPING.get(event.text())
if text is None:
return event
return QKeyEvent(event.type(), Qt.Key_unknown, event.modifiers(), text)
def main():
app = QApplication(sys.argv)
text_edit = TextEdit()
text_edit.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
推荐阅读
- excel - 记录更改列中的单元格值
- python - 编写一个对同一类的两个实例执行算术运算的方法
- kubernetes - ActiveMQ 的通用过滤器基于过滤器消费消息
- python - 使用循环打开和处理带有 csv 的 txt 文件
- python - 用于查找将分配项目 ID 的存储桶的算法
- image - 将 LUT 应用于图像 GLSL
- python - 如何更新索引以滚动到文本框小部件中找到的每个单词?
- java - 如何更改itext中单元格的字体大小?
- c - Game Of Life 做了一些奇怪的事情,我不知道怎么回事
- c# - 如何在 C# 中同时创建 emgucv.videoCapture() 的多个实例