Skip to content

Commit ffb4355

Browse files
committed
Refactor QSubProcessTool class
将`QSubProcessTool`类重构至独立的模块中并完善其功能;
1 parent 5a25333 commit ffb4355

2 files changed

Lines changed: 87 additions & 71 deletions

File tree

src/py2exe-gui/Core/packaging.py

Lines changed: 4 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
from typing import List, Optional, Sequence
1+
from typing import List, Optional
22

33
from PySide6 import QtCore
44
from PySide6.QtCore import QObject
55

6+
from .subprocess_tool import QSubProcessTool
7+
68

79
class Packaging(QObject):
810
"""执行打包的类"""
@@ -65,74 +67,5 @@ def run_packaging_process(self) -> None:
6567
"""
6668

6769
self.subprocess = QSubProcessTool()
70+
self.subprocess.output.connect(lambda val: print(val)) # 测试用
6871
self.subprocess.start_process("pyinstaller", self._args)
69-
70-
71-
class QSubProcessTool:
72-
"""自定义的辅助使用QProcess子进程的类"""
73-
74-
# TODO 将所有输出以信号形式发射
75-
def __init__(self):
76-
self.process: Optional[QtCore.QProcess] = None
77-
78-
def start_process(self, program: str, arguments: Sequence[str]) -> None:
79-
"""
80-
启动子进程 \n
81-
:param program: 子进程命令
82-
:param arguments: 子进程参数
83-
:return: None
84-
"""
85-
86-
if self.process is None: # 防止在子进程运行结束前重复启动
87-
self.process = QtCore.QProcess()
88-
self.process.readyReadStandardOutput.connect(self.handle_stdout) # type: ignore
89-
self.process.readyReadStandardError.connect(self.handle_stderr) # type: ignore
90-
self.process.stateChanged.connect(self.handle_state) # type: ignore
91-
self.process.finished.connect(self.process_finished) # type: ignore
92-
self.process.start(program, arguments)
93-
94-
def process_finished(self) -> None:
95-
"""
96-
处理子进程的槽 \n
97-
:return: None
98-
"""
99-
100-
print("Subprocess finished.")
101-
self.process = None
102-
103-
def handle_stdout(self) -> None:
104-
"""
105-
处理标准输出的槽 \n
106-
:return: None
107-
"""
108-
109-
if self.process:
110-
data = self.process.readAllStandardOutput()
111-
stdout = bytes(data).decode("utf8")
112-
print(stdout)
113-
114-
def handle_stderr(self) -> None:
115-
"""
116-
处理标准错误的槽 \n
117-
:return: None
118-
"""
119-
120-
if self.process:
121-
data = self.process.readAllStandardError()
122-
stderr = bytes(data).decode("utf8")
123-
print(stderr)
124-
125-
def handle_state(self, state: QtCore.QProcess.ProcessState) -> None:
126-
"""
127-
将子进程运行状态转换为易读形式 \n
128-
:param state: 进程运行状态
129-
:return: None
130-
"""
131-
132-
states = {
133-
QtCore.QProcess.NotRunning: "Not running",
134-
QtCore.QProcess.Starting: "Starting",
135-
QtCore.QProcess.Running: "Running",
136-
}
137-
state_name = states[state]
138-
print(f"State changed: {state_name}")
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from typing import Optional, Sequence
2+
3+
from PySide6 import QtCore
4+
5+
6+
class QSubProcessTool(QtCore.QObject):
7+
"""辅助使用QProcess创建并管理子进程的工具类"""
8+
9+
# 自定义信号,参数为 (output_type: QSubProcessTool.output_type, output_text: str)
10+
output = QtCore.Signal(tuple)
11+
12+
# output_types
13+
STATE = 0
14+
FINISHED = 1
15+
STDOUT = 2
16+
STDERR = 3
17+
18+
def __init__(self, parent: Optional[QtCore.QObject] = None) -> None:
19+
super(QSubProcessTool, self).__init__(parent)
20+
self.process: Optional[QtCore.QProcess] = None
21+
22+
def start_process(self, program: str, arguments: Sequence[str]) -> None:
23+
"""
24+
启动子进程 \n
25+
:param program: 子进程命令
26+
:param arguments: 子进程参数
27+
:return: None
28+
"""
29+
30+
if self.process is None: # 防止在子进程运行结束前重复启动
31+
self.process = QtCore.QProcess()
32+
33+
self.process.readyReadStandardOutput.connect(self._handle_stdout) # type: ignore
34+
self.process.readyReadStandardError.connect(self._handle_stderr) # type: ignore
35+
self.process.stateChanged.connect(self._handle_state) # type: ignore
36+
self.process.finished.connect(self._process_finished) # type: ignore
37+
38+
self.process.start(program, arguments)
39+
40+
def _process_finished(self) -> None:
41+
"""
42+
处理子进程的槽 \n
43+
:return: None
44+
"""
45+
self.output.emit((self.FINISHED, "Subprocess finished."))
46+
self.process = None
47+
48+
def _handle_stdout(self) -> None:
49+
"""
50+
处理标准输出的槽 \n
51+
:return: None
52+
"""
53+
54+
if self.process:
55+
data = self.process.readAllStandardOutput()
56+
stdout = bytes(data).decode("utf8")
57+
self.output.emit((self.STDOUT, stdout))
58+
59+
def _handle_stderr(self) -> None:
60+
"""
61+
处理标准错误的槽 \n
62+
:return: None
63+
"""
64+
65+
if self.process:
66+
data = self.process.readAllStandardError()
67+
stderr = bytes(data).decode("utf8")
68+
self.output.emit((self.STDERR, stderr))
69+
70+
def _handle_state(self, state: QtCore.QProcess.ProcessState) -> None:
71+
"""
72+
将子进程运行状态转换为易读形式 \n
73+
:param state: 进程运行状态
74+
:return: None
75+
"""
76+
77+
states = {
78+
QtCore.QProcess.NotRunning: "Not running",
79+
QtCore.QProcess.Starting: "Starting",
80+
QtCore.QProcess.Running: "Running",
81+
}
82+
state_name = states[state]
83+
self.output.emit((self.STATE, state_name))

0 commit comments

Comments
 (0)