diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/Curriculum_Design.iml b/.idea/Curriculum_Design.iml new file mode 100644 index 0000000..11684ae --- /dev/null +++ b/.idea/Curriculum_Design.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..96507a7 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..657dff4 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/demo.py b/src/demo.py new file mode 100644 index 0000000..5f181cb --- /dev/null +++ b/src/demo.py @@ -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_()) diff --git a/src/demo.txt b/src/demo.txt new file mode 100644 index 0000000..b93af67 --- /dev/null +++ b/src/demo.txt @@ -0,0 +1,47 @@ +## 《机械之心》第一章 陆冲的觉醒 + +刺眼的阳光透过防弹玻璃照射进来,陆冲眯起眼睛,抬手挡在额前。他的手腕上还戴着特制的镣铐,这是专门为异能者设计的,能抑制他们的特殊能力。 + +"编号A-017,请到3号检测室。"冰冷的机械女声在走廊里回荡。 + +陆冲站起身,镣铐发出清脆的碰撞声。他能感觉到周围其他实验体投来的目光,有怜悯,有恐惧,还有幸灾乐祸。在这个地下实验室里,他们不过是一群待宰的羔羊。 + +3号检测室的门在身后关上,陆冲被固定在检测台上。他闭上眼睛,感受着仪器在皮肤上游走。突然,一阵剧痛从太阳穴传来,他的意识开始模糊。 + +"滴滴滴——"刺耳的警报声响起。 + +"实验体A-017出现异常反应!"研究员的声音里带着惊恐。 + +陆冲猛地睁开眼睛,瞳孔中闪过一丝银光。他的身体开始颤抖,镣铐发出不堪重负的呻吟。他能感觉到,某种沉睡已久的力量正在苏醒。 + +"快!注射镇定剂!" + +针头刺入皮肤的瞬间,陆冲发出一声低吼。他感觉体内有什么东西在沸腾,在燃烧。记忆如潮水般涌来,他看到了漫天飞舞的机械鸟群,看到了钢铁铸就的摩天大楼,看到了自己站在高耸入云的塔顶,俯视着这座被机械统治的城市。 + +"砰!"镣铐应声而断。 + +研究员们惊恐地向后退去,陆冲缓缓站起身。他的皮肤下浮现出银色的纹路,那是机械与血肉完美融合的证明。他能听到整个实验室的机械运转声,能感受到每一台设备的脉动。 + +"拦住他!" + +安保人员冲了进来,手中的电击枪闪烁着蓝光。陆冲抬起手,电击枪突然失控,电流反向流窜,安保人员抽搐着倒下。他轻轻一挥手,实验室的门锁自动开启。 + +警报声在整个实验室回荡,红色的警示灯将走廊染成血色。陆冲大步向前,所过之处,所有的电子设备都陷入瘫痪。他能感觉到,自己就是这座钢铁牢笼的主宰。 + +"砰!"一声枪响。 + +子弹擦着陆冲的脸颊飞过,在他身后的墙上留下一个焦黑的弹孔。他转过身,看到一个穿着白大褂的中年男人举着手枪,手在微微发抖。 + +"陆冲,你不能走。"男人的声音里带着颤抖,"你是我们最成功的实验体,你体内流淌着最完美的机械之血。" + +陆冲冷笑一声:"完美?你们把我改造成怪物,就为了这个?" + +"你不是怪物!"男人激动地说,"你是机械与人类完美融合的产物,你是新人类的希望!" + +"希望?"陆冲抬起手,男人手中的枪突然扭曲变形,"我的希望就是摧毁这个实验室,摧毁所有像你们这样的人。" + +男人还想说什么,但陆冲已经转身离去。他的身影在走廊尽头消失,只留下满地狼藉和此起彼伏的警报声。 + +实验室外,陆冲站在高耸的围墙下。他仰起头,看着头顶的星空。这座城市依然灯火通明,机械鸟群在空中盘旋,钢铁巨兽在街道上穿梭。但这一切,都将因他的觉醒而改变。 + +他闭上眼睛,感受着体内澎湃的力量。机械之心在胸腔中跳动,发出规律的嗡鸣。这不是终结,而是开始。属于陆冲的时代,才刚刚拉开序幕。 \ No newline at end of file