Init 1.0 codes
This commit is contained in:
128
pyqt5fluentdesign/README.md
Normal file
128
pyqt5fluentdesign/README.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# LeonApp GUI
|
||||
|
||||
基于PyQt5和Fluent Design的App Store API图形界面工具,提供美观、易用的交互方式来访问和管理App Store的各种API功能。
|
||||
|
||||
## 功能特性
|
||||
|
||||
- **现代化界面**:采用Fluent Design风格,提供优雅、直观的用户界面
|
||||
- **应用管理**:查看所有应用列表、获取应用详细信息、搜索应用
|
||||
- **标签管理**:查看所有标签、获取标签下的应用列表
|
||||
- **开发者管理**:查看开发者的应用列表、获取开发者详细信息
|
||||
- **公告管理**:查看所有公告信息
|
||||
- **统计信息**:获取应用商店的统计数据(应用总数、开发者总数等)
|
||||
- **异步操作**:使用多线程进行API请求,避免界面卡顿
|
||||
- **分页支持**:支持列表数据的分页浏览
|
||||
- **错误处理**:友好的错误提示和信息反馈
|
||||
- **响应式设计**:适配不同屏幕尺寸
|
||||
|
||||
## 环境要求
|
||||
|
||||
- Python 3.6 或更高版本
|
||||
- PyQt5 及其依赖库
|
||||
|
||||
## 安装指南
|
||||
|
||||
1. 确保你已安装Python 3.6或更高版本
|
||||
|
||||
2. 克隆或下载此项目到本地
|
||||
|
||||
3. 安装依赖包:
|
||||
|
||||
```bash
|
||||
cd pyqt5fluentdesign
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
4. 运行应用程序:
|
||||
|
||||
```bash
|
||||
python leonapp_gui.py
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 主界面
|
||||
|
||||
应用启动后,你会看到一个包含多个标签页的主界面,每个标签页对应不同的功能模块:
|
||||
- **应用管理**:查看、搜索和浏览应用列表
|
||||
- **标签管理**:查看所有标签和标签下的应用
|
||||
- **开发者管理**:查看开发者的应用和信息
|
||||
- **公告管理**:查看所有公告
|
||||
- **统计信息**:查看应用商店的统计数据
|
||||
|
||||
### 应用管理
|
||||
|
||||
在"应用管理"标签页中:
|
||||
|
||||
1. 应用列表默认显示所有应用,每页显示20个
|
||||
2. 你可以在搜索框中输入关键词搜索应用
|
||||
3. 可以通过下拉框调整每页显示的应用数量
|
||||
4. 双击表格中的任意应用,可以查看应用的详细信息
|
||||
5. 使用"上一页"和"下一页"按钮浏览更多应用
|
||||
|
||||
### 应用详情
|
||||
|
||||
应用详情窗口显示了应用的完整信息,包括:
|
||||
- 应用名称、版本、年龄分级
|
||||
- 应用描述
|
||||
- 应用评分和下载量
|
||||
- 应用标签
|
||||
- 版本历史
|
||||
- 图片数量
|
||||
|
||||
### 标签管理
|
||||
|
||||
在"标签管理"标签页中:
|
||||
|
||||
1. 标签列表显示了所有可用的标签
|
||||
2. 双击表格中的任意标签,可以查看该标签下的所有应用
|
||||
|
||||
### 开发者管理
|
||||
|
||||
在"开发者管理"标签页中:
|
||||
|
||||
1. 输入开发者ID
|
||||
2. 点击"查看应用列表"按钮,可以查看该开发者创建的所有应用
|
||||
3. 点击"查看开发者信息"按钮,可以查看该开发者的详细信息
|
||||
|
||||
### 公告管理
|
||||
|
||||
在"公告管理"标签页中:
|
||||
|
||||
1. 公告列表显示了所有公告
|
||||
2. 使用"上一页"和"下一页"按钮浏览更多公告
|
||||
3. 双击表格中的任意公告,可以查看公告详情
|
||||
|
||||
### 统计信息
|
||||
|
||||
在"统计信息"标签页中:
|
||||
|
||||
1. 显示了应用商店的关键统计数据
|
||||
2. 点击"刷新统计数据"按钮,可以更新统计信息
|
||||
|
||||
## 配置
|
||||
|
||||
目前,API基础URL是硬编码在`leonapp_gui.py`文件中的:`http://leonmmcoset.jjxmm.win:8010/api.php`。如果你的API地址不同,你需要修改文件中的`api_base_url`变量。
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 确保API服务器正在运行,并且可以从你的计算机访问
|
||||
2. 如果遇到连接问题,请检查网络连接和防火墙设置
|
||||
3. 程序使用了多线程处理API请求,确保你的系统支持多线程操作
|
||||
4. 对于大数据量的操作,可能需要一些时间来完成数据加载
|
||||
|
||||
## 许可证
|
||||
|
||||
[MIT License](LICENSE)
|
||||
|
||||
## 作者
|
||||
|
||||
LeonApp GUI Team
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0
|
||||
- 初始版本,支持所有基本功能
|
||||
- 提供现代化的Fluent Design界面
|
||||
- 支持异步操作和分页浏览
|
||||
- 完善的错误处理和用户反馈
|
||||
BIN
pyqt5fluentdesign/__pycache__/leonapp_gui.cpython-312.pyc
Normal file
BIN
pyqt5fluentdesign/__pycache__/leonapp_gui.cpython-312.pyc
Normal file
Binary file not shown.
158
pyqt5fluentdesign/config.py
Normal file
158
pyqt5fluentdesign/config.py
Normal file
@@ -0,0 +1,158 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
配置文件 - 存储LeonApp GUI应用的配置信息
|
||||
"""
|
||||
|
||||
# API相关配置
|
||||
API_CONFIG = {
|
||||
# API基础URL
|
||||
'BASE_URL': 'http://localhost/PHP/APP%20Store/api.php',
|
||||
|
||||
# 请求超时时间(秒)
|
||||
'TIMEOUT': 10,
|
||||
|
||||
# 默认每页显示数量
|
||||
'DEFAULT_PAGE_SIZE': 20,
|
||||
|
||||
# 重试次数
|
||||
'RETRY_COUNT': 3,
|
||||
|
||||
# 请求头
|
||||
'HEADERS': {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': 'LeonApp-GUI-Client/1.0.0'
|
||||
}
|
||||
}
|
||||
|
||||
# 界面相关配置
|
||||
UI_CONFIG = {
|
||||
# 窗口标题
|
||||
'WINDOW_TITLE': 'LeonApp 应用商店客户端',
|
||||
|
||||
# 默认窗口大小
|
||||
'DEFAULT_WIDTH': 1000,
|
||||
'DEFAULT_HEIGHT': 700,
|
||||
|
||||
# 最小窗口大小
|
||||
'MIN_WIDTH': 800,
|
||||
'MIN_HEIGHT': 600,
|
||||
|
||||
# 主题设置
|
||||
'THEME': {
|
||||
# 支持 'light' 和 'dark'
|
||||
'DEFAULT_THEME': 'light',
|
||||
|
||||
# 是否跟随系统主题
|
||||
'FOLLOW_SYSTEM_THEME': True
|
||||
},
|
||||
|
||||
# 显示设置
|
||||
'DISPLAY': {
|
||||
# 是否显示状态栏
|
||||
'SHOW_STATUS_BAR': True,
|
||||
|
||||
# 是否显示工具栏
|
||||
'SHOW_TOOL_BAR': True,
|
||||
|
||||
# 详情窗口宽度占比
|
||||
'DETAIL_WIDTH_RATIO': 0.4
|
||||
}
|
||||
}
|
||||
|
||||
# 缓存相关配置
|
||||
CACHE_CONFIG = {
|
||||
# 是否启用缓存
|
||||
'ENABLE_CACHE': True,
|
||||
|
||||
# 缓存目录
|
||||
'CACHE_DIR': './cache',
|
||||
|
||||
# 缓存过期时间(秒)
|
||||
'CACHE_EXPIRY': {
|
||||
'APPS': 3600, # 应用列表缓存1小时
|
||||
'TAGS': 86400, # 标签缓存24小时
|
||||
'DEVELOPERS': 86400, # 开发者缓存24小时
|
||||
'ANNOUNCEMENTS': 3600, # 公告缓存1小时
|
||||
'STATS': 3600 # 统计信息缓存1小时
|
||||
}
|
||||
}
|
||||
|
||||
# 日志相关配置
|
||||
LOG_CONFIG = {
|
||||
# 日志级别:DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||
'LOG_LEVEL': 'INFO',
|
||||
|
||||
# 是否保存日志到文件
|
||||
'LOG_TO_FILE': True,
|
||||
|
||||
# 日志文件路径
|
||||
'LOG_FILE': './logs/leonapp_gui.log',
|
||||
|
||||
# 日志文件大小上限(字节)
|
||||
'LOG_FILE_MAX_SIZE': 10 * 1024 * 1024, # 10MB
|
||||
|
||||
# 日志文件备份数量
|
||||
'LOG_BACKUP_COUNT': 5
|
||||
}
|
||||
|
||||
# 网络连接测试配置
|
||||
NETWORK_CONFIG = {
|
||||
# 连接测试间隔(秒)
|
||||
'TEST_INTERVAL': 60,
|
||||
|
||||
# 测试URL
|
||||
'TEST_URL': 'http://localhost/PHP/APP%20Store/api.php?t=stats'
|
||||
}
|
||||
|
||||
# 搜索相关配置
|
||||
SEARCH_CONFIG = {
|
||||
# 搜索延迟(毫秒) - 用于实时搜索
|
||||
'SEARCH_DELAY': 500,
|
||||
|
||||
# 搜索结果最小字符数
|
||||
'MIN_SEARCH_CHARS': 2
|
||||
}
|
||||
|
||||
# 下载相关配置
|
||||
DOWNLOAD_CONFIG = {
|
||||
# 默认下载目录
|
||||
'DEFAULT_DOWNLOAD_DIR': './downloads',
|
||||
|
||||
# 下载线程数
|
||||
'DOWNLOAD_THREADS': 3
|
||||
}
|
||||
|
||||
# 通知相关配置
|
||||
NOTIFICATION_CONFIG = {
|
||||
# 是否启用桌面通知
|
||||
'ENABLE_DESKTOP_NOTIFICATIONS': True,
|
||||
|
||||
# 通知显示时间(秒)
|
||||
'NOTIFICATION_DISPLAY_TIME': 5
|
||||
}
|
||||
|
||||
# 语言配置
|
||||
LANGUAGE_CONFIG = {
|
||||
# 支持的语言
|
||||
'SUPPORTED_LANGUAGES': ['zh_CN', 'en_US'],
|
||||
|
||||
# 默认语言
|
||||
'DEFAULT_LANGUAGE': 'zh_CN',
|
||||
|
||||
# 是否跟随系统语言
|
||||
'FOLLOW_SYSTEM_LANGUAGE': True
|
||||
}
|
||||
|
||||
# 安全相关配置
|
||||
SECURITY_CONFIG = {
|
||||
# 是否验证SSL证书
|
||||
'VERIFY_SSL': False,
|
||||
|
||||
# 启用数据加密
|
||||
'ENABLE_ENCRYPTION': False,
|
||||
|
||||
# 加密密钥(仅当ENABLE_ENCRYPTION为True时有效)
|
||||
'ENCRYPTION_KEY': 'your-encryption-key-here'
|
||||
}
|
||||
250
pyqt5fluentdesign/fluent_design_example.py
Normal file
250
pyqt5fluentdesign/fluent_design_example.py
Normal file
@@ -0,0 +1,250 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
PyQt5 Fluent Design示例 - 展示基本的Fluent Design组件用法
|
||||
"""
|
||||
|
||||
import sys
|
||||
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel
|
||||
from PyQt5.QtCore import Qt
|
||||
from qfluentwidgets import (
|
||||
PushButton, PrimaryPushButton, DefaultPushButton,
|
||||
LineEdit, Slider, CheckBox, RadioButton, SwitchButton,
|
||||
ComboBox, SpinBox, DoubleSpinBox,
|
||||
CardWidget, TitleLabel, SubtitleLabel, BodyLabel, CaptionLabel,
|
||||
ProgressBar, Avatar, ToolTipFilter,
|
||||
FluentTranslator
|
||||
)
|
||||
|
||||
class FluentDesignExample(QWidget):
|
||||
"""Fluent Design组件示例窗口"""
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("PyQt5 Fluent Design示例")
|
||||
self.resize(800, 600)
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
"""初始化界面"""
|
||||
# 创建主布局
|
||||
main_layout = QVBoxLayout(self)
|
||||
main_layout.setContentsMargins(20, 20, 20, 20)
|
||||
main_layout.setSpacing(20)
|
||||
|
||||
# 添加标题
|
||||
title = TitleLabel("PyQt5 Fluent Design组件展示")
|
||||
subtitle = SubtitleLabel("本示例展示了PyQt-Fluent-Widgets库的基本组件用法")
|
||||
|
||||
main_layout.addWidget(title)
|
||||
main_layout.addWidget(subtitle)
|
||||
|
||||
# 创建按钮示例卡片
|
||||
buttons_card = CardWidget()
|
||||
buttons_layout = QVBoxLayout(buttons_card)
|
||||
buttons_layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
buttons_title = SubtitleLabel("按钮组件")
|
||||
buttons_layout.addWidget(buttons_title)
|
||||
|
||||
# 按钮布局
|
||||
buttons_row = QHBoxLayout()
|
||||
buttons_row.setSpacing(10)
|
||||
|
||||
# 标准按钮
|
||||
standard_button = PushButton("标准按钮")
|
||||
buttons_row.addWidget(standard_button)
|
||||
|
||||
# 主要按钮
|
||||
primary_button = PrimaryPushButton("主要按钮")
|
||||
buttons_row.addWidget(primary_button)
|
||||
|
||||
# 默认按钮
|
||||
default_button = DefaultPushButton("默认按钮")
|
||||
buttons_row.addWidget(default_button)
|
||||
|
||||
buttons_layout.addLayout(buttons_row)
|
||||
main_layout.addWidget(buttons_card)
|
||||
|
||||
# 创建输入控件示例卡片
|
||||
inputs_card = CardWidget()
|
||||
inputs_layout = QVBoxLayout(inputs_card)
|
||||
inputs_layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
inputs_title = SubtitleLabel("输入控件")
|
||||
inputs_layout.addWidget(inputs_title)
|
||||
|
||||
# 文本输入框
|
||||
text_input = LineEdit()
|
||||
text_input.setPlaceholderText("请输入文本...")
|
||||
inputs_layout.addWidget(text_input)
|
||||
|
||||
# 数字输入框
|
||||
spin_boxes_layout = QHBoxLayout()
|
||||
spin_boxes_layout.setSpacing(10)
|
||||
|
||||
spin_box = SpinBox()
|
||||
spin_box.setRange(0, 100)
|
||||
spin_box.setValue(50)
|
||||
spin_boxes_layout.addWidget(QLabel("整数:"))
|
||||
spin_boxes_layout.addWidget(spin_box)
|
||||
|
||||
double_spin_box = DoubleSpinBox()
|
||||
double_spin_box.setRange(0.0, 1.0)
|
||||
double_spin_box.setSingleStep(0.1)
|
||||
double_spin_box.setValue(0.5)
|
||||
spin_boxes_layout.addWidget(QLabel("浮点数:"))
|
||||
spin_boxes_layout.addWidget(double_spin_box)
|
||||
|
||||
inputs_layout.addLayout(spin_boxes_layout)
|
||||
|
||||
# 下拉列表
|
||||
combo_box = ComboBox()
|
||||
combo_box.addItems(["选项 1", "选项 2", "选项 3", "选项 4", "选项 5"])
|
||||
combo_box.setCurrentIndex(0)
|
||||
inputs_layout.addWidget(combo_box)
|
||||
|
||||
main_layout.addWidget(inputs_card)
|
||||
|
||||
# 创建选择控件示例卡片
|
||||
selection_card = CardWidget()
|
||||
selection_layout = QVBoxLayout(selection_card)
|
||||
selection_layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
selection_title = SubtitleLabel("选择控件")
|
||||
selection_layout.addWidget(selection_title)
|
||||
|
||||
# 复选框
|
||||
checkbox_layout = QHBoxLayout()
|
||||
checkbox_layout.setSpacing(20)
|
||||
|
||||
checkbox1 = CheckBox("选项 1")
|
||||
checkbox2 = CheckBox("选项 2")
|
||||
checkbox3 = CheckBox("选项 3")
|
||||
checkbox3.setChecked(True)
|
||||
|
||||
checkbox_layout.addWidget(checkbox1)
|
||||
checkbox_layout.addWidget(checkbox2)
|
||||
checkbox_layout.addWidget(checkbox3)
|
||||
|
||||
selection_layout.addLayout(checkbox_layout)
|
||||
|
||||
# 单选按钮
|
||||
radio_layout = QHBoxLayout()
|
||||
radio_layout.setSpacing(20)
|
||||
|
||||
radio1 = RadioButton("选项 A")
|
||||
radio2 = RadioButton("选项 B")
|
||||
radio3 = RadioButton("选项 C")
|
||||
radio1.setChecked(True)
|
||||
|
||||
radio_layout.addWidget(radio1)
|
||||
radio_layout.addWidget(radio2)
|
||||
radio_layout.addWidget(radio3)
|
||||
|
||||
selection_layout.addLayout(radio_layout)
|
||||
|
||||
# 开关按钮
|
||||
switch_layout = QHBoxLayout()
|
||||
switch_layout.setSpacing(10)
|
||||
|
||||
switch_label = QLabel("启用功能:")
|
||||
switch_button = SwitchButton()
|
||||
switch_button.setChecked(True)
|
||||
|
||||
switch_layout.addWidget(switch_label)
|
||||
switch_layout.addWidget(switch_button)
|
||||
switch_layout.addStretch()
|
||||
|
||||
selection_layout.addLayout(switch_layout)
|
||||
|
||||
main_layout.addWidget(selection_card)
|
||||
|
||||
# 创建进度条示例卡片
|
||||
progress_card = CardWidget()
|
||||
progress_layout = QVBoxLayout(progress_card)
|
||||
progress_layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
progress_title = SubtitleLabel("进度条")
|
||||
progress_layout.addWidget(progress_title)
|
||||
|
||||
# 水平进度条
|
||||
progress_bar = ProgressBar()
|
||||
progress_bar.setValue(65)
|
||||
progress_layout.addWidget(progress_bar)
|
||||
|
||||
main_layout.addWidget(progress_card)
|
||||
|
||||
# 创建标签和头像示例卡片
|
||||
misc_card = CardWidget()
|
||||
misc_layout = QVBoxLayout(misc_card)
|
||||
misc_layout.setContentsMargins(20, 20, 20, 20)
|
||||
|
||||
misc_title = SubtitleLabel("文本标签和头像")
|
||||
misc_layout.addWidget(misc_title)
|
||||
|
||||
# 文本标签
|
||||
labels_layout = QVBoxLayout()
|
||||
labels_layout.setSpacing(5)
|
||||
|
||||
title_label = TitleLabel("标题文本")
|
||||
subtitle_label = SubtitleLabel("副标题文本")
|
||||
body_label = BodyLabel("正文文本,这是一个普通的正文文本示例")
|
||||
caption_label = CaptionLabel("说明文本,通常用于辅助信息")
|
||||
|
||||
labels_layout.addWidget(title_label)
|
||||
labels_layout.addWidget(subtitle_label)
|
||||
labels_layout.addWidget(body_label)
|
||||
labels_layout.addWidget(caption_label)
|
||||
|
||||
misc_layout.addLayout(labels_layout)
|
||||
|
||||
# 头像
|
||||
avatar_layout = QHBoxLayout()
|
||||
avatar_layout.setSpacing(10)
|
||||
|
||||
avatar1 = Avatar("用户A", size=48)
|
||||
avatar2 = Avatar("用户B", size=64)
|
||||
avatar3 = Avatar("用户C", size=32)
|
||||
|
||||
# 添加工具提示
|
||||
avatar1.installEventFilter(ToolTipFilter(avatar1))
|
||||
avatar1.setToolTip("用户A的头像")
|
||||
|
||||
avatar2.installEventFilter(ToolTipFilter(avatar2))
|
||||
avatar2.setToolTip("用户B的头像")
|
||||
|
||||
avatar3.installEventFilter(ToolTipFilter(avatar3))
|
||||
avatar3.setToolTip("用户C的头像")
|
||||
|
||||
avatar_layout.addWidget(avatar1)
|
||||
avatar_layout.addWidget(avatar2)
|
||||
avatar_layout.addWidget(avatar3)
|
||||
avatar_layout.addStretch()
|
||||
|
||||
misc_layout.addLayout(avatar_layout)
|
||||
|
||||
main_layout.addWidget(misc_card)
|
||||
|
||||
# 添加底部信息
|
||||
footer = CaptionLabel("PyQt5 Fluent Design示例 v1.0.0")
|
||||
footer.setAlignment(Qt.AlignCenter)
|
||||
main_layout.addWidget(footer)
|
||||
|
||||
# 添加伸缩项,使内容居中
|
||||
main_layout.addStretch(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 创建应用实例
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
# 添加中文支持
|
||||
translator = FluentTranslator()
|
||||
app.installTranslator(translator)
|
||||
|
||||
# 创建并显示主窗口
|
||||
window = FluentDesignExample()
|
||||
window.show()
|
||||
|
||||
# 运行应用
|
||||
sys.exit(app.exec_())
|
||||
1360
pyqt5fluentdesign/leonapp_gui.py
Normal file
1360
pyqt5fluentdesign/leonapp_gui.py
Normal file
File diff suppressed because it is too large
Load Diff
5
pyqt5fluentdesign/requirements.txt
Normal file
5
pyqt5fluentdesign/requirements.txt
Normal file
@@ -0,0 +1,5 @@
|
||||
PyQt5==5.15.7
|
||||
PyQt5-Qt5==5.15.2
|
||||
PyQt5-sip==12.11.0
|
||||
requests==2.31.0
|
||||
PyQt-Fluent-Widgets==1.8.7
|
||||
Reference in New Issue
Block a user