You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:57:20