多线程应该关闭整个进程但不会
Multithreading should close the whole process but doesn't
我正在尝试做一个导入 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 和这个网站,但没有成功。
谢谢
我更改了 kill 进程,只创建一个对象(不需要两个实例)。
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()
我正在尝试做一个导入 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 和这个网站,但没有成功。
谢谢
我更改了 kill 进程,只创建一个对象(不需要两个实例)。
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()