From e73ac3a5c89aad1c62c8963a521b8fda6636ef78 Mon Sep 17 00:00:00 2001 From: wood chen Date: Wed, 27 Nov 2024 14:24:42 +0800 Subject: [PATCH] test --- .github/workflows/release.yml | 117 +++++++++++++++++++++++----------- gui.py | 48 +++++++++++++- requirements.txt | 1 + 3 files changed, 128 insertions(+), 38 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f02e33b..7569928 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,7 +6,7 @@ on: workflow_dispatch: permissions: - contents: write # 添加这个权限声明 + contents: write jobs: create-release: @@ -16,13 +16,11 @@ jobs: version: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v3 - - name: Generate version number id: version run: | SHA_SHORT=$(git rev-parse --short HEAD) echo "version=1.0.0-${SHA_SHORT}" >> $GITHUB_OUTPUT - - name: Create Release id: create_release uses: softprops/action-gh-release@v1 @@ -39,12 +37,11 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v3 - - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.11' - + - name: Download FFmpeg run: | mkdir ffmpeg @@ -62,8 +59,7 @@ jobs: - name: Build with PyInstaller shell: cmd run: | - pyinstaller --name video2webp --onefile --windowed --hidden-import ffmpeg --add-data "ffmpeg/ffmpeg.exe;ffmpeg" --add-data "ffmpeg/ffprobe.exe;ffmpeg" --add-data "README.md;." --clean --noconfirm --log-level=INFO gui.py - + pyinstaller --name video2webp --onefile --windowed --add-data "ffmpeg/ffmpeg.exe;ffmpeg" --add-data "ffmpeg/ffprobe.exe;ffmpeg" --add-data "README.md;." --icon=icon.ico --clean gui.py - name: Upload Release Asset uses: softprops/action-gh-release@v1 @@ -84,16 +80,7 @@ jobs: with: python-version: '3.11' - - name: Download FFmpeg - run: | - mkdir ffmpeg - curl -L https://github.com/eugeneware/ffmpeg-static/releases/download/b4.4/darwin-x64 -o ffmpeg/ffmpeg - curl -L https://github.com/eugeneware/ffmpeg-static/releases/download/b4.4/darwin-x64 -o ffmpeg/ffprobe - chmod +x ffmpeg/ffmpeg ffmpeg/ffprobe - - # 或者使用 Homebrew(备选方案) - - name: Install FFmpeg using Homebrew - if: failure() + - name: Install FFmpeg run: | brew install ffmpeg mkdir -p ffmpeg @@ -106,34 +93,75 @@ jobs: pip install -r requirements.txt pip install pyinstaller - # 创建启动器脚本 - - name: Create launcher script + # 创建 macOS 专用的启动器 + - name: Create macOS launcher run: | - echo 'import os, sys; os.environ["PATH"] = os.path.join(os.path.dirname(sys.executable), "ffmpeg") + os.pathsep + os.environ["PATH"]' > launcher.py - cat gui.py >> launcher.py + cat > macos_launcher.py << EOL + import os + import sys + import tkinter.filedialog + import tkinter.messagebox + from tkinter import * + # macOS 原生拖放支持 + def drop_handler(event): + if not hasattr(event, 'data'): return + files = event.data.split('\n') + files = [f.strip() for f in files if f.strip()] + if files: + app.handle_drop_files(files) + + # 修改主程序以支持原生拖放 + with open('gui.py', 'r') as f: + code = f.read() + + code = code.replace( + 'from tkinterdnd2 import TkinterDnD, DND_FILES', + '# Using native macOS drag and drop' + ) + + # 添加原生拖放支持 + code = code.replace( + 'self.root = TkinterDnD.Tk()', + 'self.root = tk.Tk()\n self.root.drop_target_register = lambda *args: None\n self.root.bind("<>", drop_handler)' + ) + + with open('gui_macos.py', 'w') as f: + f.write(code) + EOL + - name: Build with PyInstaller run: | - pyinstaller --name video2webp --onefile --windowed --add-data "ffmpeg/ffmpeg:ffmpeg" --add-data "ffmpeg/ffprobe:ffmpeg" --add-data "README.md:." launcher.py - - - name: Create DMG + pyinstaller --name video2webp \ + --onefile \ + --windowed \ + --add-data "ffmpeg/ffmpeg:ffmpeg" \ + --add-data "ffmpeg/ffprobe:ffmpeg" \ + --add-data "README.md:." \ + --icon=icons/logo800.icns \ + --clean \ + macos_launcher.py + + - name: Create App Bundle run: | - cd dist - mkdir -p video2webp.app/Contents/MacOS - mkdir -p video2webp.app/Contents/Resources/ffmpeg - mv video2webp video2webp.app/Contents/MacOS/ - cp ../ffmpeg/* video2webp.app/Contents/Resources/ffmpeg/ + mkdir -p "dist/Video2Webp.app/Contents/MacOS" + mkdir -p "dist/Video2Webp.app/Contents/Resources" + cp dist/video2webp "dist/Video2Webp.app/Contents/MacOS/" + cp -r ffmpeg "dist/Video2Webp.app/Contents/Resources/" + cp icons/logo800.icns "dist/Video2Webp.app/Contents/Resources/video2webp.icns" # 创建 Info.plist - cat > video2webp.app/Contents/Info.plist << EOL + cat > "dist/Video2Webp.app/Contents/Info.plist" << EOL CFBundleExecutable video2webp + CFBundleIconFile + video2webp.icns CFBundleIdentifier - com.example.video2webp + com.video2webp.app CFBundleName Video2Webp CFBundlePackageType @@ -144,17 +172,34 @@ jobs: 10.10 NSHighResolutionCapable + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + mp4 + avi + mov + mkv + webm + gif + + CFBundleTypeRole + Viewer + + EOL - - # 创建 DMG - hdiutil create -volname "Video2Webp" -srcfolder video2webp.app -ov -format UDZO video2webp.dmg - + + - name: Create DMG + run: | + hdiutil create -volname "Video2Webp" -srcfolder "dist/Video2Webp.app" -ov -format UDZO "dist/Video2Webp.dmg" + - name: Upload Release Asset uses: softprops/action-gh-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: v${{ needs.create-release.outputs.version }} - files: ./dist/video2webp.dmg + files: ./dist/Video2Webp.dmg diff --git a/gui.py b/gui.py index a37cbb8..7afc3ea 100644 --- a/gui.py +++ b/gui.py @@ -8,6 +8,15 @@ import webbrowser from threading import Thread import traceback +# 修改 tkinterdnd2 的导入和初始化方式 +ENABLE_DND = False +try: + from tkinterdnd2 import TkinterDnD, DND_FILES + + ENABLE_DND = True +except ImportError: + print("tkinterdnd2 导入失败,拖放功能将不可用") + # 设置 FFmpeg 路径 if getattr(sys, "frozen", False): # 运行在 PyInstaller 打包后的环境 @@ -36,8 +45,12 @@ def get_subprocess_config(): class VideoToWebpConverter: def __init__(self): - # 创建主窗口 - self.root = tk.Tk() + # 创建主窗口,使用 TkinterDnD.Tk() 替代 tk.Tk() + if ENABLE_DND: + self.root = TkinterDnD.Tk() + else: + self.root = tk.Tk() + self.root.title("视频或gif转WEBP工具") # 设置窗口大小和位置 @@ -54,6 +67,17 @@ class VideoToWebpConverter: style.configure("TButton", padding=6) style.configure("TLabelframe", background="#f0f0f0") + # 只在支持拖放时启用相关功能 + if ENABLE_DND: + self.root.drop_target_register(DND_FILES) + self.root.dnd_bind("<>", self.handle_drop) + + # 添加拖放提示标签 + self.drop_label = ttk.Label( + self.root, text="将视频文件拖放到此处", font=("", 12), foreground="gray" + ) + self.drop_label.pack(pady=10) + # 设置UI self.setup_ui() @@ -454,6 +478,26 @@ class VideoToWebpConverter: def run(self): self.root.mainloop() + def handle_drop(self, event): + """处理文件拖放事件""" + files = self.root.tk.splitlist(event.data) + valid_extensions = (".mp4", ".avi", ".mov", ".mkv", ".webm", ".gif") + + # 过滤出支持的文件格式 + valid_files = [f for f in files if f.lower().endswith(valid_extensions)] + + if valid_files: + # 清空现有列表 + self.files_list.delete(0, tk.END) + # 添加新文件 + for file in valid_files: + self.files_list.insert(tk.END, file) + else: + messagebox.showwarning( + "格式不支持", + "请拖放支持的视频格���文件:\n" + ", ".join(valid_extensions), + ) + if __name__ == "__main__": try: diff --git a/requirements.txt b/requirements.txt index 4ae851c..9a525b2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ # 核心依赖 Pillow>=9.0.0 +tkinterdnd2==0.3.0