Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
846bcbd
Enhance port selection and speedtest URL handling
ntbowen Nov 28, 2025
c9a21ef
resources for GUI
ntbowen Nov 28, 2025
76c2b31
Add graphical mode instructions to README
ntbowen Nov 28, 2025
8ab1d16
Update cloudflare_speedtest_gui.py
ntbowen Nov 28, 2025
69da612
feat: 添加 GUI 图形界面及多平台打包工作流
ntbowen Nov 28, 2025
5fdadfe
fix: 修复 GUI 打包工作流依赖问题
ntbowen Nov 28, 2025
cb9d614
feat: 多架构打包工作流
ntbowen Nov 28, 2025
95da3da
fix: 修复 ARM64 AppImage 构建问题
ntbowen Nov 28, 2025
a73eb17
fix: 修复 macOS Dock 图标显示问题
ntbowen Nov 28, 2025
a9f92c5
fix: 修复 ARM64 AppImage 和 macOS 图标/菜单问题
ntbowen Nov 28, 2025
0c01a40
fix: 使用 linuxdeploy 替代 appimagetool 解决 ARM64 多架构问题
ntbowen Nov 28, 2025
846652a
feat: 使用 flet build 替代 flet pack 优化 macOS 启动速度
ntbowen Nov 28, 2025
f5ac98e
feat: 所有平台使用 flet build 替代 flet pack
ntbowen Nov 28, 2025
d778153
fix: 修复工作流 YAML 格式问题
ntbowen Nov 28, 2025
71e4212
fix: 修复 flet build 工作流
ntbowen Nov 28, 2025
a4924fa
fix: 修复打包后权限问题
ntbowen Nov 28, 2025
4b064bc
fix: 混合构建策略
ntbowen Nov 28, 2025
8a31f1b
fix: 修复绝对路径执行问题
ntbowen Nov 28, 2025
85d2998
fix: 修复 release job 文件提取
ntbowen Nov 28, 2025
6c4828e
fix: 移除不稳定的 arm64 AppImage,更新 macOS runner
ntbowen Nov 28, 2025
a19ccf8
fix: 改回免费的 macos-13 runner
ntbowen Nov 28, 2025
0826b01
Enhance README with graphical interface details
ntbowen Nov 29, 2025
4187716
Update README.md
ntbowen Nov 29, 2025
d3c47f5
Update README.md
ntbowen Nov 29, 2025
32f1ce2
Fix image formatting in README.md
ntbowen Nov 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
352 changes: 352 additions & 0 deletions .github/workflows/build-gui.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,352 @@
name: Build GUI Packages

on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
version:
description: 'Version number (e.g., 1.0.0)'
required: false
default: '1.0.0'

jobs:
build-linux-x64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libfuse2 rpm
pip install flet pyinstaller pillow
pip install -r requirements-gui.txt
- name: Build with Flet Pack
run: |
flet pack cloudflare_speedtest_gui.py --name yx-tools-gui --icon icon/icon.png --add-data "cloudflare_speedtest.py:." --add-data "icon:icon"
- name: Create desktop file
run: |
cat > yx-tools-gui.desktop << 'DESKTOP_EOF'
[Desktop Entry]
Name=yx-tools-gui
Comment=Cloudflare IP Speed Test Tool
Exec=yx-tools-gui
Icon=yx-tools-gui
Terminal=false
Type=Application
Categories=Network;
DESKTOP_EOF
sed -i 's/^ //' yx-tools-gui.desktop
- name: Create packages
run: |
VERSION=${{ github.event.inputs.version || '1.0.0' }}

# AppImage
wget -q https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O appimagetool
chmod +x appimagetool
mkdir -p AppDir/usr/{bin,share/{applications,icons/hicolor/256x256/apps}}
cp dist/yx-tools-gui AppDir/usr/bin/
cp icon/icon.png AppDir/yx-tools-gui.png
cp icon/icon.png AppDir/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
cp yx-tools-gui.desktop AppDir/
cp yx-tools-gui.desktop AppDir/usr/share/applications/
echo '#!/bin/bash' > AppDir/AppRun
echo 'HERE=$(dirname "$(readlink -f "$0")")' >> AppDir/AppRun
echo 'exec "${HERE}/usr/bin/yx-tools-gui" "$@"' >> AppDir/AppRun
chmod +x AppDir/AppRun
ARCH=x86_64 ./appimagetool AppDir yx-tools-gui-x86_64.AppImage

# DEB
mkdir -p deb-pkg/{DEBIAN,opt/yx-tools-gui,usr/{bin,share/{applications,icons/hicolor/256x256/apps}}}
cp dist/yx-tools-gui deb-pkg/opt/yx-tools-gui/
cp icon/icon.png deb-pkg/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
echo '#!/bin/bash' > deb-pkg/usr/bin/yx-tools-gui
echo 'exec /opt/yx-tools-gui/yx-tools-gui "$@"' >> deb-pkg/usr/bin/yx-tools-gui
chmod +x deb-pkg/usr/bin/yx-tools-gui
sed 's|Exec=yx-tools-gui|Exec=/usr/bin/yx-tools-gui|' yx-tools-gui.desktop > deb-pkg/usr/share/applications/yx-tools-gui.desktop
echo "Package: yx-tools-gui" > deb-pkg/DEBIAN/control
echo "Version: ${VERSION}" >> deb-pkg/DEBIAN/control
echo "Architecture: amd64" >> deb-pkg/DEBIAN/control
echo "Maintainer: Joey and Zag" >> deb-pkg/DEBIAN/control
echo "Description: Cloudflare IP Speed Test Tool" >> deb-pkg/DEBIAN/control
dpkg-deb --build deb-pkg yx-tools-gui_${VERSION}_amd64.deb

# RPM
mkdir -p rpmbuild/{BUILD,RPMS,SPECS,SOURCES}
cp dist/yx-tools-gui rpmbuild/SOURCES/
cp icon/icon.png rpmbuild/SOURCES/
sed 's|Exec=yx-tools-gui|Exec=/usr/bin/yx-tools-gui|' yx-tools-gui.desktop > rpmbuild/SOURCES/yx-tools-gui.desktop
cat > rpmbuild/SPECS/yx-tools-gui.spec << SPEC_EOF
Name: yx-tools-gui
Version: ${VERSION}
Release: 1
Summary: Cloudflare IP Speed Test Tool
License: MIT
%description
Cloudflare IP Speed Test Tool
%install
mkdir -p %{buildroot}/opt/yx-tools-gui %{buildroot}/usr/bin %{buildroot}/usr/share/applications %{buildroot}/usr/share/icons/hicolor/256x256/apps
cp %{_sourcedir}/yx-tools-gui %{buildroot}/opt/yx-tools-gui/
chmod +x %{buildroot}/opt/yx-tools-gui/yx-tools-gui
cp %{_sourcedir}/icon.png %{buildroot}/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
echo '#!/bin/bash' > %{buildroot}/usr/bin/yx-tools-gui
echo 'exec /opt/yx-tools-gui/yx-tools-gui "\$@"' >> %{buildroot}/usr/bin/yx-tools-gui
chmod +x %{buildroot}/usr/bin/yx-tools-gui
cp %{_sourcedir}/yx-tools-gui.desktop %{buildroot}/usr/share/applications/
%files
/opt/yx-tools-gui/yx-tools-gui
/usr/bin/yx-tools-gui
/usr/share/applications/yx-tools-gui.desktop
/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
SPEC_EOF
sed -i 's/^ //' rpmbuild/SPECS/yx-tools-gui.spec
rpmbuild --define "_topdir ${GITHUB_WORKSPACE}/rpmbuild" -bb rpmbuild/SPECS/yx-tools-gui.spec
cp rpmbuild/RPMS/x86_64/*.rpm yx-tools-gui-${VERSION}.x86_64.rpm
- uses: actions/upload-artifact@v4
with:
name: linux-x64-packages
path: |
yx-tools-gui-*.x86_64.rpm
yx-tools-gui_*_amd64.deb
yx-tools-gui-x86_64.AppImage
compression-level: 0

build-linux-arm64:
runs-on: ubuntu-24.04-arm
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libfuse2 rpm
pip install flet pyinstaller pillow
pip install -r requirements-gui.txt
- name: Build with Flet Pack
run: |
flet pack cloudflare_speedtest_gui.py --name yx-tools-gui --icon icon/icon.png --add-data "cloudflare_speedtest.py:." --add-data "icon:icon"
- name: Create desktop file
run: |
cat > yx-tools-gui.desktop << 'DESKTOP_EOF'
[Desktop Entry]
Name=yx-tools-gui
Comment=Cloudflare IP Speed Test Tool
Exec=yx-tools-gui
Icon=yx-tools-gui
Terminal=false
Type=Application
Categories=Network;
DESKTOP_EOF
sed -i 's/^ //' yx-tools-gui.desktop
- name: Create packages
run: |
VERSION=${{ github.event.inputs.version || '1.0.0' }}

# DEB
mkdir -p deb-pkg/{DEBIAN,opt/yx-tools-gui,usr/{bin,share/{applications,icons/hicolor/256x256/apps}}}
cp dist/yx-tools-gui deb-pkg/opt/yx-tools-gui/
cp icon/icon.png deb-pkg/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
echo '#!/bin/bash' > deb-pkg/usr/bin/yx-tools-gui
echo 'exec /opt/yx-tools-gui/yx-tools-gui "$@"' >> deb-pkg/usr/bin/yx-tools-gui
chmod +x deb-pkg/usr/bin/yx-tools-gui
sed 's|Exec=yx-tools-gui|Exec=/usr/bin/yx-tools-gui|' yx-tools-gui.desktop > deb-pkg/usr/share/applications/yx-tools-gui.desktop
echo "Package: yx-tools-gui" > deb-pkg/DEBIAN/control
echo "Version: ${VERSION}" >> deb-pkg/DEBIAN/control
echo "Architecture: arm64" >> deb-pkg/DEBIAN/control
echo "Maintainer: Joey and Zag" >> deb-pkg/DEBIAN/control
echo "Description: Cloudflare IP Speed Test Tool" >> deb-pkg/DEBIAN/control
dpkg-deb --build deb-pkg yx-tools-gui_${VERSION}_arm64.deb

# RPM
mkdir -p rpmbuild/{BUILD,RPMS,SPECS,SOURCES}
cp dist/yx-tools-gui rpmbuild/SOURCES/
cp icon/icon.png rpmbuild/SOURCES/
sed 's|Exec=yx-tools-gui|Exec=/usr/bin/yx-tools-gui|' yx-tools-gui.desktop > rpmbuild/SOURCES/yx-tools-gui.desktop
cat > rpmbuild/SPECS/yx-tools-gui.spec << SPEC_EOF
Name: yx-tools-gui
Version: ${VERSION}
Release: 1
Summary: Cloudflare IP Speed Test Tool
License: MIT
%description
Cloudflare IP Speed Test Tool
%install
mkdir -p %{buildroot}/opt/yx-tools-gui %{buildroot}/usr/bin %{buildroot}/usr/share/applications %{buildroot}/usr/share/icons/hicolor/256x256/apps
cp %{_sourcedir}/yx-tools-gui %{buildroot}/opt/yx-tools-gui/
chmod +x %{buildroot}/opt/yx-tools-gui/yx-tools-gui
cp %{_sourcedir}/icon.png %{buildroot}/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
echo '#!/bin/bash' > %{buildroot}/usr/bin/yx-tools-gui
echo 'exec /opt/yx-tools-gui/yx-tools-gui "\$@"' >> %{buildroot}/usr/bin/yx-tools-gui
chmod +x %{buildroot}/usr/bin/yx-tools-gui
cp %{_sourcedir}/yx-tools-gui.desktop %{buildroot}/usr/share/applications/
%files
/opt/yx-tools-gui/yx-tools-gui
/usr/bin/yx-tools-gui
/usr/share/applications/yx-tools-gui.desktop
/usr/share/icons/hicolor/256x256/apps/yx-tools-gui.png
SPEC_EOF
sed -i 's/^ //' rpmbuild/SPECS/yx-tools-gui.spec
rpmbuild --define "_topdir ${GITHUB_WORKSPACE}/rpmbuild" -bb rpmbuild/SPECS/yx-tools-gui.spec
cp rpmbuild/RPMS/aarch64/*.rpm yx-tools-gui-${VERSION}.aarch64.rpm
- uses: actions/upload-artifact@v4
with:
name: linux-arm64-packages
path: |
yx-tools-gui-*.aarch64.rpm
yx-tools-gui_*_arm64.deb
compression-level: 0

build-windows-x64:
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install flet pyinstaller pillow
pip install -r requirements-gui.txt
- name: Build with Flet Pack
run: |
flet pack cloudflare_speedtest_gui.py --name yx-tools-gui --icon icon/icon.png --add-data "cloudflare_speedtest.py;." --add-data "icon;icon"
- name: Package
run: |
Copy-Item "dist/yx-tools-gui.exe" -Destination "yx-tools-gui-x64.exe"
shell: pwsh
- uses: actions/upload-artifact@v4
with:
name: exe-x64
path: yx-tools-gui-x64.exe
compression-level: 0

build-windows-arm64:
runs-on: windows-11-arm
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
pip install flet pyinstaller pillow
pip install -r requirements-gui.txt
- name: Build with Flet Pack
run: |
flet pack cloudflare_speedtest_gui.py --name yx-tools-gui --icon icon/icon.png --add-data "cloudflare_speedtest.py;." --add-data "icon;icon"
- name: Package
run: |
Copy-Item "dist/yx-tools-gui.exe" -Destination "yx-tools-gui-arm64.exe"
shell: pwsh
- uses: actions/upload-artifact@v4
with:
name: exe-arm64
path: yx-tools-gui-arm64.exe
compression-level: 0

build-macos-intel:
runs-on: macos-13
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.24.0'
channel: 'stable'
- name: Install dependencies
run: |
pip install flet
pip install -r requirements-gui.txt
- name: Prepare assets
run: |
mkdir -p assets
cp icon/icon.png assets/icon.png
- name: Build with Flet
run: flet build macos --project "yx-tools-gui" --product "yx-tools-gui" --org "com.yxtools" --build-version "${{ github.event.inputs.version || '1.0.0' }}" -v
- name: Create DMG
run: |
VERSION=${{ github.event.inputs.version || '1.0.0' }}
APP_PATH=$(find build -name "*.app" -type d | head -1)
if [ -z "$APP_PATH" ]; then
echo "Error: App bundle not found"
find build -type d
exit 1
fi
echo "Found app: $APP_PATH"
brew install create-dmg
create-dmg --volname "yx-tools-gui" --window-size 600 400 --icon-size 100 --icon "$(basename $APP_PATH)" 150 185 --app-drop-link 450 185 "yx-tools-gui-${VERSION}-intel.dmg" "$APP_PATH" || hdiutil create -volname "yx-tools-gui" -srcfolder "$APP_PATH" -ov -format UDZO "yx-tools-gui-${VERSION}-intel.dmg"
- uses: actions/upload-artifact@v4
with:
name: dmg-intel
path: yx-tools-gui-*-intel.dmg
compression-level: 0

build-macos-arm:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: '3.24.0'
channel: 'stable'
- name: Install dependencies
run: |
pip install flet
pip install -r requirements-gui.txt
- name: Prepare assets
run: |
mkdir -p assets
cp icon/icon.png assets/icon.png
- name: Build with Flet
run: flet build macos --project "yx-tools-gui" --product "yx-tools-gui" --org "com.yxtools" --build-version "${{ github.event.inputs.version || '1.0.0' }}" -v
- name: Create DMG
run: |
VERSION=${{ github.event.inputs.version || '1.0.0' }}
APP_PATH=$(find build -name "*.app" -type d | head -1)
if [ -z "$APP_PATH" ]; then
echo "Error: App bundle not found"
find build -type d
exit 1
fi
echo "Found app: $APP_PATH"
brew install create-dmg
create-dmg --volname "yx-tools-gui" --window-size 600 400 --icon-size 100 --icon "$(basename $APP_PATH)" 150 185 --app-drop-link 450 185 "yx-tools-gui-${VERSION}-apple-silicon.dmg" "$APP_PATH" || hdiutil create -volname "yx-tools-gui" -srcfolder "$APP_PATH" -ov -format UDZO "yx-tools-gui-${VERSION}-apple-silicon.dmg"
- uses: actions/upload-artifact@v4
with:
name: dmg-apple-silicon
path: yx-tools-gui-*-apple-silicon.dmg
compression-level: 0

release:
needs: [build-linux-x64, build-linux-arm64, build-windows-x64, build-windows-arm64, build-macos-intel, build-macos-arm]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- uses: actions/download-artifact@v4
with:
path: artifacts
- name: Prepare release files
run: |
mkdir -p release
find artifacts -type f \( -name "*.dmg" -o -name "*.exe" -o -name "*.deb" -o -name "*.rpm" -o -name "*.AppImage" \) -exec cp {} release/ \;
ls -la release/
- uses: softprops/action-gh-release@v1
with:
files: release/*
draft: false
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,13 @@
- **多架构支持** - 支持amd64和arm64架构
- **环境隔离** - 容器化运行,环境干净整洁

### 图形化界面
- **现代化图形界面** - 操作更加直观友好
- **主题切换** - 可根据个人喜好选择主题
- **多架构支持** - 支持amd64和arm64架构
<img width="2104" height="1798" alt="image" src="https://github.com/user-attachments/assets/f6438b5c-3108-434b-95b8-1a60166332aa" />
<img width="2104" height="1798" alt="image" src="https://github.com/user-attachments/assets/47eaab5d-74c1-4e64-9d76-b63f9aafca8a" />

## 支持平台

| 平台 | 架构 | 状态 |
Expand Down Expand Up @@ -92,6 +99,9 @@ pip install -r requirements.txt
# 运行程序(命令行模式)
python3 cloudflare_speedtest.py --mode beginner --count 10 --speed 1 --delay 1000

# 运行程序(图形模式)
python3 cloudflare_speedtest_gui.py

# 查看帮助
python3 cloudflare_speedtest.py --help
```
Expand All @@ -105,6 +115,8 @@ python3 cloudflare_speedtest.py --help
- `CloudflareSpeedTest-macos-arm64` - macOS Apple Silicon
- `CloudflareSpeedTest-linux-amd64` - Linux x64
- `CloudflareSpeedTest-linux-arm64` - Linux ARM64
- `yx-tools-gui-xxx.xxx` - 各平台的图形化版本


### 方法四:使用Docker(推荐容器化部署)

Expand Down
Binary file added assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading