pyqt中写了个函数在程序中读写word,然后将函数放入线程thread中运行,看文档结果则没有写入word。

我写了个小程序试了下,也无法写word,不知道是什么情况,如果不能在线程里写,程序要大改,还请帮忙一二

img

我忘记在程序中写保存了

【以下回答由 GPT 生成】

问题的原因是使用PyQt时,在线程中直接操作Word文档可能会导致一些问题。这是因为GUI库通常需要在主线程中操作。为了解决这个问题,你可以使用QObject类和QThread类来创建一个自定义线程。下面是修改后的代码:

from PyQt5.QtCore import QObject, QThread, pyqtSignal
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt

class Worker(QObject):
    finished = pyqtSignal()

    def process(self):
        doc = Document('c:\\users\\niepl\\Desktop\\1\\控制系统判读结果(内部).doc')
        pandujieguo = doc.add_paragraph('一、分系统判读结果')
        pandujieguo.style.font.size = Pt(10)
        pandujieguo.add_run('1、上电自检判读正常')
        doc.styles['Normal'].font.name = 'Times New Roman'
        doc.styles['Normal'].font.size = Pt(12)
        Secret = doc.add_paragraph()
        Secret.add_run('内部').bold = True
        title = doc.add_heading("试验数据结果报告")
        title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
        doc.save('c:\\users\\niepl\\Desktop\\111控制系统判读结果(内部).doc')
        self.finished.emit()

def xieword():
    worker = Worker()
    thread = QThread()
    worker.moveToThread(thread)
    thread.started.connect(worker.process)
    worker.finished.connect(thread.quit)
    worker.finished.connect(worker.deleteLater)
    thread.finished.connect(thread.deleteLater)
    thread.start()

xieword()

在这个修改后的代码中,我将读写Word文档的操作放入了一个自定义的Worker类中,并将其移动到了一个单独的线程中。通过这种方式,可以在GUI线程中同时更新UI并在后台进行Word文档操作。

希望这个解决方案能够解决你的问题。如果你还有其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

引用 皆我百晓生 小程序回复内容作答:
首先,需要注意的是,PyQt中的UI操作是在主线程中进行的,而不是在子线程中进行的。在主线程以外的线程中进行UI操作是不安全的,可能会导致程序崩溃或无法正常工作。

如果你想在子线程中进行文件读写操作,可以考虑使用Python的多线程库threading,而不是使用PyQt的QThread

以下是一个使用threading库的简单示例,展示了如何在子线程中进行文件读写操作:

import threading

def read_write_word():
    # 在这里进行word文件的读写操作
    pass

def my_thread():
    # 创建一个子线程
    t = threading.Thread(target=read_write_word)
    # 启动子线程
    t.start()

if __name__ == '__main__':
    # 在主线程中启动子线程
    my_thread()

read_write_word函数中,你可以编写你的word读写代码。注意,在这个函数中,你应该避免进行任何UI相关的操作,因为该函数是在子线程中执行的。

希望这对你有帮助,如果还有其他问题,请随时提问。