PyQt5桌面应用开发(12):QFile与线程安全

文章详细描述了一个使用PyQt5开发的桌面应用在读取文件时遇到的段错误问题。问题出现在调用`setPlainText`方法时,通过gdb调试发现是由于`open`和`read`函数在多线程环境中的线程不安全性导致。解决方案是改用PyQt5的`QFile`类来替代Python的文件操作,确保线程安全。

PyQt5桌面应用系列

segment fault

一个可爱的PyQt5程序,但有有点瑕疵……

editor

点击左边的文件树中的文件时,就会打开文件,读入内容并设置到中间的代码编辑器控件中。程序启动时,自动读入本文对应的python源程序。

self.editor.setPlainText(read_file("segfaults_pyqt5.py"))

第一次读入时,一切正常,文件正常载入和显示。但是当点击文件读入时间触发后,程序会自动退出,显示段错误 (核心已转储)

这究竟是怎么回事呢?真相只有一个,我们再来完整看看源代码。

import time
from PyQt5.QtCore import Qt, QDir, QModelIndex, QFile, QIODevice
from PyQt5.QtGui import QIcon, QTextDocument
from PyQt5.QtWidgets import QApplication, QTreeWidgetItem, QToolBar, QStatusBar, QStyle, QFormLayout, QLineEdit
from PyQt5.QtWidgets import QDockWidget
from PyQt5.QtWidgets import QMainWindow, QWidget, QMenuBar, QTreeWidget

from code_editor import QCodeEditor
from py_syntax_highlighter import PythonHighlighter

def read_file(filename) -> str:
    return open(filename, 'r', encoding="utf-8").read()

class MyMainWindow(QMainWindow):
    def __init__(self):
        super(MyMainWindow, self).__init__()
        self.setWindowIcon(QIcon('icon.png'))
        self.setWindowTitle('PyQt5 Editor')
        self.editor = QCodeEditor(display_line_numbers=True,
                                  highlight_current_line=True,
                                  syntax_high_lighter=PythonHighlighter)
        self.setCentralWidget(self.editor)

        # 第一次读入文件:OK
        self.editor.setPlainText(read_file("segfaults_pyqt5.py"))
        self._set_menubar()
        self._set_toolbar()
        self._set_statusbar()
        self._set_left_dock()
        self._set_right_dock()

    def _set_menubar(self: QMainWindow):
        mb = QMenuBar(parent=self)

        file_menu = mb.addMenu('&File')
        for a in ['&New', '&Open', '&Save', '&Save as']:
            file_menu.addAction(QIcon("icon.png"), a, self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大福是小强

除非你钱多烧得慌……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值