PyQt5实现txt行循环填入QTextEdit时程序崩溃问题求解
崩溃核心原因
你的程序被系统强制杀死(终端返回killed)的直接原因是死循环导致内存/CPU资源被占满,结合其他逻辑错误,具体问题点如下:
- 错误新建控件:你在
execute_all方法里重新实例化了8个全新的QTextEdit,这些控件不是你在UI文件里预先创建、已经显示在界面上的控件,既没有父对象也没有被加入布局,属于完全无效的悬空控件 - 死循环逻辑:你将
w初始化为包含8个新控件的列表后,循环判断not w in all_textedit,但isinstance(w, QTextEdit)判断永远不成立(w是列表类型,不是单个控件),因此w永远不会被更新,循环永远不会退出,直接耗尽系统资源 - 迭代器逻辑错误:你用
itertools.chain(w)生成的迭代器只有8个元素,当txt文件行数超过8行时,第9次调用next(it)会直接抛出StopIteration异常触发崩溃 - 逻辑不符合需求:你用
append方法写入内容时,没有做循环映射,就算不崩溃也无法实现第9行回到第一个控件的轮询填充效果
修复后可运行代码
首先确认你在Qt Designer中给界面上的8个QTextEdit设置的objectName分别为textEdit_1到textEdit_8(如果命名不同,替换代码中对应的控件名即可),修复后的完整代码如下:
import sys from PyQt5.QtWidgets import QApplication, QDialog, QStackedWidget from PyQt5.uic import loadUi class Task(QDialog): def __init__(self): super(Task, self).__init__() loadUi("task.ui", self) self.exit.clicked.connect(self.taskscreen) self.all_b.clicked.connect(self.execute_all) # 初始化时就把界面上已有的8个QTextEdit按顺序存到列表,不要在按钮点击时新建 self.text_edit_list = [ self.textEdit_1, self.textEdit_2, self.textEdit_3, self.textEdit_4, self.textEdit_5, self.textEdit_6, self.textEdit_7, self.textEdit_8 ] # 统一设置只读 for te in self.text_edit_list: te.setReadOnly(True) def taskscreen(self): login = MainScreen() widget.addWidget(login) widget.setCurrentIndex(widget.currentIndex()+1) widget.setFixedHeight(620) widget.setFixedWidth(1080) def execute_all(self): # 先清空所有文本框的旧内容 for te in self.text_edit_list: te.clear() # 读取txt文件所有行,处理换行符和编码 try: with open("taches.txt", "r", encoding="utf-8") as file: lines = [line.strip() for line in file.readlines() if line.strip()] except Exception as e: self.textEdit_1.append(f"读取文件失败: {str(e)}") return # 按索引轮询分配行:第i行放到第 i%8 个文本框,自动循环 for idx, line in enumerate(lines): target_edit = self.text_edit_list[idx % len(self.text_edit_list)] target_edit.append(line) if __name__ == "__main__": app = QApplication(sys.argv) widget = QStackedWidget() task = Task() widget.addWidget(task) widget.setFixedHeight(600) widget.setFixedWidth(1024) widget.show() try: sys.exit(app.exec_()) except: print("bye")
代码说明
- 控件列表在窗口初始化阶段就从已加载的UI中获取,完全复用你预先在UI中创建好的控件,不会出现内容写了但界面不显示的问题
- 用取模运算
idx % 8实现自动轮询,不管txt有多少行都能正确循环分配到8个文本框,不会出现迭代器越界问题 - 增加了文件读取异常捕获,避免文件不存在/编码错误时程序直接崩溃
- 每次点击按钮先清空旧内容,不会出现多次点击内容重复叠加的问题
- 对读取到的每行做strip处理,去掉末尾的换行符,避免显示时出现多余空行
内容的提问来源于stack exchange,提问作者user19332420
相关产品推荐
相关产品推荐

