forked from p9o3yklam/Curriculum_Design
parent
3f0ae5507b
commit
06e563bb22
@ -0,0 +1,8 @@
|
||||
# 默认忽略的文件
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# 基于编辑器的 HTTP 客户端请求
|
||||
/httpRequests/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="PYTHON_MODULE" version="4">
|
||||
<component name="NewModuleRootManager">
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
||||
</content>
|
||||
<orderEntry type="jdk" jdkName="Python 3.13 (Curriculum_Design)" jdkType="Python SDK" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
||||
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Black">
|
||||
<option name="sdkName" value="Python 3.13 (Curriculum_Design)" />
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (Curriculum_Design)" project-jdk-type="Python SDK" />
|
||||
</project>
|
||||
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/Curriculum_Design.iml" filepath="$PROJECT_DIR$/.idea/Curriculum_Design.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@ -0,0 +1,124 @@
|
||||
import sys
|
||||
import os
|
||||
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTextEdit, QAction,
|
||||
QFileDialog, QVBoxLayout, QWidget, QLabel, QStatusBar)
|
||||
from PyQt5.QtGui import QFont, QTextCursor
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
class WordDemo(QMainWindow):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.initUI()
|
||||
self.file_content = ""
|
||||
self.current_position = 0
|
||||
|
||||
def initUI(self):
|
||||
# 设置窗口标题和大小
|
||||
self.setWindowTitle('Word Demo - 打字显示TXT内容')
|
||||
self.setGeometry(100, 100, 800, 600)
|
||||
|
||||
# 创建中央部件和布局
|
||||
central_widget = QWidget()
|
||||
self.setCentralWidget(central_widget)
|
||||
layout = QVBoxLayout(central_widget)
|
||||
|
||||
# 创建状态栏
|
||||
self.statusBar = QStatusBar()
|
||||
self.setStatusBar(self.statusBar)
|
||||
self.status_label = QLabel("就绪")
|
||||
self.statusBar.addWidget(self.status_label)
|
||||
|
||||
# 创建文本编辑器
|
||||
self.text_edit = QTextEdit()
|
||||
self.text_edit.setFont(QFont("Arial", 12))
|
||||
self.text_edit.textChanged.connect(self.on_text_changed)
|
||||
layout.addWidget(self.text_edit)
|
||||
|
||||
# 创建菜单栏
|
||||
menubar = self.menuBar()
|
||||
file_menu = menubar.addMenu('文件')
|
||||
|
||||
# 添加打开文件动作
|
||||
open_action = QAction('打开', self)
|
||||
open_action.setShortcut('Ctrl+O')
|
||||
open_action.triggered.connect(self.open_file)
|
||||
file_menu.addAction(open_action)
|
||||
|
||||
# 添加退出动作
|
||||
exit_action = QAction('退出', self)
|
||||
exit_action.setShortcut('Ctrl+Q')
|
||||
exit_action.triggered.connect(self.close)
|
||||
file_menu.addAction(exit_action)
|
||||
|
||||
# 显示界面
|
||||
self.show()
|
||||
|
||||
def open_file(self):
|
||||
# 打开文件对话框
|
||||
file_path, _ = QFileDialog.getOpenFileName(
|
||||
self, "打开文本文件", "", "文本文件 (*.txt);;所有文件 (*)")
|
||||
|
||||
if file_path:
|
||||
try:
|
||||
# 读取文件内容
|
||||
with open(file_path, 'r', encoding='utf-8') as file:
|
||||
self.file_content = file.read()
|
||||
|
||||
# 重置状态
|
||||
self.current_position = 0
|
||||
self.text_edit.clear()
|
||||
|
||||
# 更新状态栏
|
||||
file_name = os.path.basename(file_path)
|
||||
self.status_label.setText(f"已加载文件: {file_name} - 共 {len(self.file_content)} 字符")
|
||||
|
||||
except Exception as e:
|
||||
self.status_label.setText(f"错误: {str(e)}")
|
||||
|
||||
def on_text_changed(self):
|
||||
# 获取当前文本长度
|
||||
current_text = self.text_edit.toPlainText()
|
||||
text_length = len(current_text)
|
||||
|
||||
# 如果文本长度增加
|
||||
if text_length > self.current_position:
|
||||
# 计算需要显示的新字符数
|
||||
new_chars_count = text_length - self.current_position
|
||||
|
||||
# 确保不超过文件内容长度
|
||||
if self.current_position + new_chars_count <= len(self.file_content):
|
||||
# 获取当前光标位置
|
||||
cursor = self.text_edit.textCursor()
|
||||
cursor_pos = cursor.position()
|
||||
|
||||
# 替换用户输入的内容为文件内容
|
||||
new_text = self.file_content[:text_length]
|
||||
self.text_edit.blockSignals(True) # 暂时阻塞信号防止递归调用
|
||||
self.text_edit.setPlainText(new_text)
|
||||
|
||||
# 恢复光标位置
|
||||
cursor.setPosition(cursor_pos)
|
||||
self.text_edit.setTextCursor(cursor)
|
||||
self.text_edit.blockSignals(False) # 解除信号阻塞
|
||||
|
||||
# 更新当前位置
|
||||
self.current_position = text_length
|
||||
|
||||
# 更新状态栏
|
||||
self.status_label.setText(f"已输入: {text_length}/{len(self.file_content)} 字符")
|
||||
else:
|
||||
# 如果超出文件内容长度,阻止继续输入
|
||||
self.text_edit.blockSignals(True)
|
||||
self.text_edit.setPlainText(self.file_content)
|
||||
self.text_edit.blockSignals(False)
|
||||
self.status_label.setText("已到达文件末尾")
|
||||
|
||||
# 如果文本长度减少(用户删除内容)
|
||||
elif text_length < self.current_position:
|
||||
self.current_position = text_length
|
||||
self.status_label.setText(f"已输入: {text_length}/{len(self.file_content)} 字符")
|
||||
|
||||
if __name__ == '__main__':
|
||||
app = QApplication(sys.argv)
|
||||
demo = WordDemo()
|
||||
sys.exit(app.exec_())
|
||||
Loading…
Reference in new issue