Многопоточность должна закрывать весь процесс, но не

Я пытаюсь сделать простой исполняемый файл, который импортирует PDF-файл и с pyttsx3 читает PDF-файл. Поскольку pyttsx3 не может приостановить чтение, я создал небольшую функцию с psutil, которая убивает процесс с именем Python.exe (может быть, не идеальный способ). простой интерфейс с Easygui позволяет выбрать PDF-файл, страницу, с которой начать, и закрыть процесс при нажатии кнопки (с помощью psutil).

Как я понял многопоточность, должен быть основной процесс с многопоточным выполнением; поэтому я подумал, что, закрыв весь процесс, я остановлю скрипт всякий раз, когда пользователь нажимает кнопку. Не работает. Поток закрыт, а основной процесс - нет, поэтому скрипт продолжает работать (голос продолжает читать). После того, как у меня будет рабочая версия, я планирую использовать pyinstaller, чтобы преобразовать ее в exe-файл.

Код такой:

from pyttsx3 import *
from pyttsx3.drivers import sapi5
from PyPDF2 import PdfFileReader
from threading import *
from psutil import process_iter
from easygui import enterbox,fileopenbox,msgbox,choicebox

class Audiobook():

    def readbook(self,title,page=0):
        book = open(title, 'rb')
        pdfReader = PdfFileReader(book)
        pages = pdfReader.numPages
        speaker = init()

        speaker.setProperty('rate',150)
        
        for num in range(page-1,pages):
            page = pdfReader.getPage(num)
            text = page.extractText()
            speaker.say(text)
            speaker.runAndWait()
            speaker.say("You arrived to page" + str(num+1))

    def title(self):
        title = fileopenbox()
        if title:
            page = int(enterbox("From which page would you like to read? ",'Choose the page'))
        else:
            return
        self.readbook(title,page)

    def killprocess(self):
        kill = msgbox("Click here to stop reading","Close the Application?")
        if kill is not None:
            procname = 'Python.exe' #this line will be changed when converted into an executable with pyinstaller
            for proc in process_iter():
                if proc.name() == procname: 
                    proc.kill()

processcontrol = Audiobook()
bookreader = Audiobook()
process1 = Thread(target=bookreader.title)
process2 = Thread(target=processcontrol.killprocess)
process2.start()
process1.start()

Есть идеи, что я делаю не так? Я подделал Google и этот сайт, но безуспешно.

благодаря

1 ответ

Решение

Я изменил процесс уничтожения и создал только один объект (два экземпляра не понадобились).

import pyttsx3
from pyttsx3.drivers import sapi5
from PyPDF2 import PdfFileReader
from threading import Thread
from psutil import process_iter
from easygui import enterbox,fileopenbox,msgbox,choicebox
import os
import signal

class Audiobook():

    def readbook(self,title,page=0):
        book = open(title, 'rb')
        pdfReader = PdfFileReader(book)
        pages = pdfReader.numPages
        speaker = pyttsx3.init()

        speaker.setProperty('rate',150)

        for num in range(page-1,pages):
            page = pdfReader.getPage(num)
            text = page.extractText()
            speaker.say(text)
            speaker.runAndWait()
            speaker.say("You arrived to page" + str(num+1))

    def title(self):
        title = fileopenbox(default="*.pdf",filetypes=["*.pdf"])
        if title:
            page = enterbox("From which page would you like to read? ",'Choose the page')
            page = 1 if page=="" else int(page)
        else:
            return
        self.readbook(title,page)

    def killprocess(self):
        kill = msgbox("Click here to stop reading","Close the Application?")
        if kill is not None:
            os.kill(os.getpid(),signal.SIGTERM)

bookreader = Audiobook()
process1 = Thread(target=bookreader.title)
process2 = Thread(target=bookreader.killprocess)
process2.start()
process1.start()
Другие вопросы по тегам