Skip to content

Commit 1de18bd

Browse files
committed
✨ 更新版本至0.2.0,优化导出逻辑与界面交互,分离导出线程和ui线程
1 parent ede91ff commit 1de18bd

File tree

5 files changed

+62
-17
lines changed

5 files changed

+62
-17
lines changed

SimpleCutMainFrame.py

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
"""Subclass of MainFrame, which is generated by wxFormBuilder."""
22
import os
3+
import subprocess
34
import time
5+
from enum import Enum
46

57
import wx
68

79
import SimpleCutPy
810
import logging
11+
import threading
912

1013
from command import concat_filter, merge_filestream_audio_channel
1114
from pymediainfo import MediaInfo
1215

1316

17+
VERSION = "0.2.0"
18+
1419
class FileDropTarget(wx.FileDropTarget):
1520
def __init__(self, target):
1621
wx.FileDropTarget.__init__(self)
@@ -24,7 +29,16 @@ def OnDropFiles(self, x, y, filenames):
2429

2530

2631
# TODO: 重写配置的参数验证,建立物品类和导出配置 ExportConfig
27-
# TODO: 多线程剪辑
32+
33+
class ExportMessageState(Enum):
34+
SUCCESS = "成功"
35+
ERROR = "错误"
36+
37+
38+
class ExportMessage:
39+
def __init__(self, state: ExportMessageState, message: any):
40+
self.state = state
41+
self.message = message
2842

2943

3044
# Implementing MainFrame
@@ -156,7 +170,6 @@ def MovDownBtnOnClick(self, event):
156170
self.list_ctrl.Select(self.first_selected_index + 1)
157171

158172
def ExportBtnOnClick(self, event):
159-
# TODO: Implement ExportBtnOnClick
160173
# TODO: 加了码率设置的功能,别忘了测试
161174

162175
# 从界面读取导出文件名、路径、码率
@@ -176,13 +189,21 @@ def ExportBtnOnClick(self, event):
176189
# 导出路径不为空则更改工作路径
177190
if not export_path == '':
178191
os.chdir(export_path)
192+
else:
193+
# 默认使用第一个文件的目录
194+
os.chdir(os.path.dirname(self.item_list[0]["path"]))
195+
196+
threading.Thread(target=self.export_videofile, args=(export_amix, export_mbps, export_name)).start()
197+
self.ExportBtn.Disable()
179198

199+
return
200+
201+
def export_videofile(self, export_amix, export_mbps, export_name):
180202
# 导出命令
181203
console_command = 'ffmpeg '
182204
filter_complex_string = '-filter_complex '
183205
filter_complex_filters: list[str] = []
184206
concat_inputs: list[str] = []
185-
186207
for item in self.item_list:
187208
no = item["no"]
188209
start_time = item["start_time"]
@@ -219,26 +240,28 @@ def ExportBtnOnClick(self, event):
219240
else:
220241
# 单音轨
221242
concat_inputs.append(f'{no}:a')
222-
223243
# 使用 concat 滤镜
224244
concat_string = concat_filter(concat_inputs, "v", "a")
225245
filter_complex_filters.append(concat_string)
226-
227246
# 拼接 filter_complex 命令行参数,拼接滤镜
228247
console_command += filter_complex_string + f'"{";".join(filter_complex_filters)}"'
229-
230248
console_command += ' -map "[v]" -map "[a]"'
231-
232249
# 拼接全指令
233250
if not export_name.endswith(".mp4"):
234251
export_name += ".mp4"
235-
236252
console_command += f' -b:v {export_mbps}M "{export_name}"'
237-
238253
logging.info(f"导出命令:{console_command}")
239254

240-
# os.system(console_command)
241-
return
255+
# 执行命令
256+
try:
257+
subprocess.run(console_command, shell=False, check=True)
258+
259+
# 完成命令,发送事件
260+
wx.CallAfter(self.on_export_done, ExportMessage(ExportMessageState.SUCCESS, "导出完成"))
261+
except subprocess.CalledProcessError as e:
262+
# 导出失败,发送事件
263+
wx.CallAfter(self.on_export_done, ExportMessage(ExportMessageState.ERROR, e))
264+
242265

243266
def ProjectWebBtnOnClick(self, event):
244267
# TODO: Implement ProjectWebBtnOnClick
@@ -332,6 +355,17 @@ def list_load_item(self, load_item, list_ctrl_index):
332355
self.list_ctrl.SetItem(list_ctrl_index, 3, load_item["end_time"])
333356
self.list_ctrl.SetItem(list_ctrl_index, 4, load_item["path"])
334357

358+
def on_export_done(self, msg: ExportMessage):
359+
logging.debug(f"Export Done: {msg}")
360+
if msg.state == ExportMessageState.SUCCESS:
361+
wx.MessageBox("导出成功", "提示", wx.OK | wx.ICON_INFORMATION)
362+
elif msg.state == ExportMessageState.ERROR:
363+
logging.error(f"Export Error: {msg.message}")
364+
wx.MessageBox("导出失败", "提示", wx.OK | wx.ICON_INFORMATION)
365+
366+
self.ExportBtn.Enable()
367+
return
368+
335369

336370
if __name__ == '__main__':
337371
App = wx.App()

SimpleCutPy.fbp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
<object class="notebookpage" expanded="true">
125125
<property name="bitmap"></property>
126126
<property name="label">素材设置</property>
127-
<property name="select">1</property>
127+
<property name="select">0</property>
128128
<object class="wxPanel" expanded="true">
129129
<property name="BottomDockable">1</property>
130130
<property name="LeftDockable">1</property>
@@ -1745,7 +1745,7 @@
17451745
<object class="notebookpage" expanded="true">
17461746
<property name="bitmap"></property>
17471747
<property name="label">关于</property>
1748-
<property name="select">0</property>
1748+
<property name="select">1</property>
17491749
<object class="wxPanel" expanded="true">
17501750
<property name="BottomDockable">1</property>
17511751
<property name="LeftDockable">1</property>
@@ -1836,7 +1836,7 @@
18361836
<property name="gripper">0</property>
18371837
<property name="hidden">0</property>
18381838
<property name="id">wxID_ANY</property>
1839-
<property name="label">关于 Pure Clip:&#x0A;一个用于进行简单剪切工作的开源迷你剪辑软件。&#x0A;&#x0A;项目地址:&#x0A;&#x0A;--FishCat233&#x0A;2024.2.27&#x0A;&#x0A;Pure Clip 版本号&#x0A;0.1</property>
1839+
<property name="label">关于 Pure Clip:&#x0A;一个用于进行简单剪切工作的开源迷你剪辑软件。&#x0A;&#x0A;项目地址:&#x0A;&#x0A;--FishCat233&#x0A;2024.2.27&#x0A;&#x0A;Pure Clip 版本号&#x0A;0.2.0</property>
18401840
<property name="markup">0</property>
18411841
<property name="max_size"></property>
18421842
<property name="maximize_button">0</property>

SimpleCutPy.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def __init__( self, parent ):
8888
self.m_panel2.SetSizer( bSizer4 )
8989
self.m_panel2.Layout()
9090
bSizer4.Fit( self.m_panel2 )
91-
self.m_notebook1.AddPage( self.m_panel2, u"素材设置", True )
91+
self.m_notebook1.AddPage( self.m_panel2, u"素材设置", False )
9292
self.m_panel3 = wx.Panel( self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
9393
bSizer5 = wx.BoxSizer( wx.VERTICAL )
9494

@@ -175,7 +175,7 @@ def __init__( self, parent ):
175175
self.m_panel4 = wx.Panel( self.m_notebook1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
176176
bSizer8 = wx.BoxSizer( wx.VERTICAL )
177177

178-
self.m_staticText6 = wx.StaticText( self.m_panel4, wx.ID_ANY, u"关于 Pure Clip:\n一个用于进行简单剪切工作的开源迷你剪辑软件。\n\n项目地址:\n\n--FishCat233\n2024.2.27\n\nPure Clip 版本号\n0.1", wx.DefaultPosition, wx.DefaultSize, 0 )
178+
self.m_staticText6 = wx.StaticText( self.m_panel4, wx.ID_ANY, u"关于 Pure Clip:\n一个用于进行简单剪切工作的开源迷你剪辑软件。\n\n项目地址:\n\n--FishCat233\n2024.2.27\n\nPure Clip 版本号\n0.2.0", wx.DefaultPosition, wx.DefaultSize, 0 )
179179
self.m_staticText6.Wrap( -1 )
180180

181181
bSizer8.Add( self.m_staticText6, 0, wx.ALL, 5 )
@@ -187,7 +187,7 @@ def __init__( self, parent ):
187187
self.m_panel4.SetSizer( bSizer8 )
188188
self.m_panel4.Layout()
189189
bSizer8.Fit( self.m_panel4 )
190-
self.m_notebook1.AddPage( self.m_panel4, u"关于", False )
190+
self.m_notebook1.AddPage( self.m_panel4, u"关于", True )
191191

192192
bSizer3.Add( self.m_notebook1, 1, wx.EXPAND |wx.ALL, 5 )
193193

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ requires-python = "==3.12.*"
77
dependencies = [
88
"logging>=0.4.9.6",
99
"pymediainfo>=7.0.1",
10+
"pypubsub>=4.0.3",
1011
"wxpython>=4.2.2",
1112
]

uv.lock

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)