Compare commits
186 Commits
@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
MagicWord macOS简化打包脚本
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
import shutil
|
||||
|
||||
def run_command(cmd):
|
||||
"""运行命令"""
|
||||
print(f"运行: {' '.join(cmd)}")
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
if result.returncode != 0:
|
||||
print(f"错误: {result.stderr}")
|
||||
return False
|
||||
return True
|
||||
|
||||
def main():
|
||||
print("=== MagicWord macOS打包 ===")
|
||||
|
||||
# 清理旧的构建文件
|
||||
print("清理构建文件...")
|
||||
for folder in ['build', 'dist', '__pycache__']:
|
||||
if os.path.exists(folder):
|
||||
shutil.rmtree(folder)
|
||||
|
||||
# 安装依赖
|
||||
print("安装依赖...")
|
||||
if not run_command([sys.executable, "-m", "pip", "install", "-r", "requirements.txt"]):
|
||||
return
|
||||
|
||||
if not run_command([sys.executable, "-m", "pip", "install", "pyinstaller"]):
|
||||
return
|
||||
|
||||
# 构建命令 - 包含所有必要的图片和图标文件
|
||||
cmd = [
|
||||
sys.executable, "-m", "PyInstaller",
|
||||
"--name", "MagicWord",
|
||||
"--distpath", "dist",
|
||||
"--workpath", "build",
|
||||
# 资源文件
|
||||
"--add-data", "resources:resources",
|
||||
# UI图片文件
|
||||
"--add-data", "src/ui/UI.png:ui",
|
||||
"--add-data", "src/ui/114514.png:ui",
|
||||
# 图标文件
|
||||
"--add-data", "resources/icons/app_icon_32X32.png:resources/icons",
|
||||
"--add-data", "resources/icons/app_icon_64X64.png:resources/icons",
|
||||
"--add-data", "resources/icons/app_icon_128X128.png:resources/icons",
|
||||
"--add-data", "resources/icons/app_icon_256X256.png:resources/icons",
|
||||
# 隐藏导入模块
|
||||
"--hidden-import", "PyQt5",
|
||||
"--hidden-import", "PyQt5.QtCore",
|
||||
"--hidden-import", "PyQt5.QtGui",
|
||||
"--hidden-import", "PyQt5.QtWidgets",
|
||||
"--hidden-import", "requests",
|
||||
"--hidden-import", "beautifulsoup4",
|
||||
"--hidden-import", "python-docx",
|
||||
"--hidden-import", "PyPDF2",
|
||||
"--hidden-import", "ebooklib",
|
||||
"--hidden-import", "chardet",
|
||||
"--hidden-import", "PIL",
|
||||
# macOS应用选项
|
||||
"--windowed",
|
||||
"--osx-bundle-identifier", "com.magicword.app",
|
||||
"--icon", "resources/icons/app_icon_128X128.png",
|
||||
"src/main.py"
|
||||
]
|
||||
|
||||
print("构建应用...")
|
||||
if run_command(cmd):
|
||||
print("✅ 构建成功!")
|
||||
print(f"应用位置: {os.path.abspath('dist/MagicWord.app')}")
|
||||
print("\n安装步骤:")
|
||||
print("1. 将 MagicWord.app 拖拽到 Applications 文件夹")
|
||||
print("2. 首次运行时,右键点击应用选择'打开'")
|
||||
else:
|
||||
print("❌ 构建失败!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 99 KiB |
|
After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 372 B |
|
After Width: | Height: | Size: 763 B |
|
After Width: | Height: | Size: 216 B |
|
After Width: | Height: | Size: 257 B |
|
After Width: | Height: | Size: 323 B |
|
After Width: | Height: | Size: 199 B |
@ -0,0 +1,8 @@
|
||||
@echo off
|
||||
echo 设置Qt调试环境变量...
|
||||
set QT_DEBUG_PLUGINS=1
|
||||
echo Qt调试模式已启用
|
||||
echo.
|
||||
echo 运行MagicWord应用程序...
|
||||
python src/main.py
|
||||
pause
|
||||
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
echo "设置Qt调试环境变量..."
|
||||
export QT_DEBUG_PLUGINS=1
|
||||
echo "Qt调试模式已启用"
|
||||
echo ""
|
||||
echo "运行MagicWord应用程序..."
|
||||
python src/main.py
|
||||
@ -0,0 +1,20 @@
|
||||
#!/bin/bash
|
||||
# MagicWord 修复版启动脚本
|
||||
|
||||
echo "🚀 正在启动 MagicWord (修复版)..."
|
||||
|
||||
# 使用新的虚拟环境
|
||||
source new_venv/bin/activate
|
||||
|
||||
# 设置Qt环境变量
|
||||
export QT_PLUGIN_PATH="/Users/maziang/Documents/CodingWorkPlace/Code/Curriculum_Design/new_venv/lib/python3.9/site-packages/PyQt5/Qt5/plugins"
|
||||
export QT_QPA_PLATFORM_PLUGIN_PATH="/Users/maziang/Documents/CodingWorkPlace/Code/Curriculum_Design/new_venv/lib/python3.9/site-packages/PyQt5/Qt5/plugins/platforms"
|
||||
export QT_QPA_PLATFORM="cocoa"
|
||||
export QT_MAC_WANTS_LAYER="1"
|
||||
export QT_LOGGING_RULES="qt.qpa.*=false"
|
||||
|
||||
echo "✅ 环境设置完成"
|
||||
echo "✅ 正在启动 MagicWord 应用..."
|
||||
|
||||
# 启动应用
|
||||
cd src && python main.py
|
||||
@ -0,0 +1,7 @@
|
||||
# PyQt5环境变量设置
|
||||
export QT_PLUGIN_PATH="/Users/maziang/Documents/CodingWorkPlace/Code/Curriculum_Design/.venv/lib/python3.9/site-packages/PyQt5/Qt5/plugins"
|
||||
export QT_QPA_PLATFORM_PLUGIN_PATH="/Users/maziang/Documents/CodingWorkPlace/Code/Curriculum_Design/.venv/lib/python3.9/site-packages/PyQt5/Qt5/plugins/platforms"
|
||||
|
||||
export QT_QPA_PLATFORM="cocoa"
|
||||
export QT_MAC_WANTS_LAYER="1"
|
||||
export QT_LOGGING_RULES="qt.qpa.*=false"
|
||||
|
After Width: | Height: | Size: 125 KiB |
|
After Width: | Height: | Size: 40 KiB |
@ -0,0 +1,437 @@
|
||||
# snake_game.py
|
||||
"""
|
||||
贪吃蛇小游戏模块
|
||||
用户用WASD或方向键控制贪吃蛇移动
|
||||
"""
|
||||
|
||||
import sys
|
||||
import random
|
||||
from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QLabel, QMessageBox
|
||||
from PyQt5.QtCore import Qt, QTimer, pyqtSignal, QRect
|
||||
from PyQt5.QtGui import QPainter, QColor, QFont, QBrush, QPen
|
||||
|
||||
|
||||
class SnakeGame(QWidget):
|
||||
"""贪吃蛇游戏画布"""
|
||||
|
||||
# 游戏常量
|
||||
GRID_SIZE = 20 # 网格大小
|
||||
GRID_WIDTH = 30 # 水平网格数
|
||||
GRID_HEIGHT = 20 # 垂直网格数
|
||||
GAME_SPEED = 150 # 游戏速度(毫秒)
|
||||
MIN_SPEED = 50 # 最小速度(毫秒)
|
||||
MAX_SPEED = 300 # 最大速度(毫秒)
|
||||
SPEED_STEP = 10 # 速度调节步长(毫秒)
|
||||
|
||||
# 信号
|
||||
score_changed = pyqtSignal(int)
|
||||
game_over = pyqtSignal(int)
|
||||
speed_changed = pyqtSignal(int) # 速度改变信号
|
||||
|
||||
# 方向常量
|
||||
UP = (0, -1)
|
||||
DOWN = (0, 1)
|
||||
LEFT = (-1, 0)
|
||||
RIGHT = (1, 0)
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.init_game()
|
||||
self.init_ui()
|
||||
|
||||
def init_ui(self):
|
||||
"""初始化UI"""
|
||||
self.setFixedSize(
|
||||
self.GRID_WIDTH * self.GRID_SIZE,
|
||||
self.GRID_HEIGHT * self.GRID_SIZE
|
||||
)
|
||||
self.setStyleSheet("background-color: #1a1a1a;")
|
||||
self.setFocus() # 获取焦点以接收键盘输入
|
||||
|
||||
def init_game(self):
|
||||
"""初始化游戏状态"""
|
||||
# 蛇的初始位置(从中间开始)
|
||||
self.snake = [
|
||||
(self.GRID_WIDTH // 2, self.GRID_HEIGHT // 2),
|
||||
(self.GRID_WIDTH // 2 - 1, self.GRID_HEIGHT // 2),
|
||||
(self.GRID_WIDTH // 2 - 2, self.GRID_HEIGHT // 2),
|
||||
]
|
||||
|
||||
# 方向
|
||||
self.direction = self.RIGHT
|
||||
self.next_direction = self.RIGHT
|
||||
|
||||
# 食物位置
|
||||
self.food = self.generate_food()
|
||||
|
||||
# 分数
|
||||
self.score = 0
|
||||
|
||||
# 游戏速度
|
||||
self.current_speed = self.GAME_SPEED
|
||||
|
||||
# 游戏状态
|
||||
self.is_running = False
|
||||
self.is_game_over = False
|
||||
|
||||
# 游戏定时器
|
||||
self.game_timer = QTimer()
|
||||
self.game_timer.timeout.connect(self.update_game)
|
||||
|
||||
def generate_food(self):
|
||||
"""生成食物位置"""
|
||||
while True:
|
||||
x = random.randint(0, self.GRID_WIDTH - 1)
|
||||
y = random.randint(0, self.GRID_HEIGHT - 1)
|
||||
if (x, y) not in self.snake:
|
||||
return (x, y)
|
||||
|
||||
def start_game(self):
|
||||
"""开始游戏"""
|
||||
if not self.is_running:
|
||||
self.is_running = True
|
||||
self.is_game_over = False
|
||||
self.game_timer.start(self.current_speed)
|
||||
self.setFocus()
|
||||
|
||||
def pause_game(self):
|
||||
"""暂停游戏"""
|
||||
if self.is_running:
|
||||
self.is_running = False
|
||||
self.game_timer.stop()
|
||||
|
||||
def resume_game(self):
|
||||
"""恢复游戏"""
|
||||
if not self.is_running and not self.is_game_over:
|
||||
self.is_running = True
|
||||
self.game_timer.start(self.current_speed)
|
||||
|
||||
def restart_game(self):
|
||||
"""重新开始游戏"""
|
||||
self.game_timer.stop()
|
||||
self.init_game()
|
||||
self.score_changed.emit(0)
|
||||
self.speed_changed.emit(self.current_speed)
|
||||
self.update()
|
||||
# 重新启动游戏
|
||||
self.start_game()
|
||||
|
||||
def increase_speed(self):
|
||||
"""增加游戏速度"""
|
||||
if self.current_speed > self.MIN_SPEED:
|
||||
self.current_speed = max(self.current_speed - self.SPEED_STEP, self.MIN_SPEED)
|
||||
self.speed_changed.emit(self.current_speed)
|
||||
if self.is_running:
|
||||
self.game_timer.setInterval(self.current_speed)
|
||||
|
||||
def decrease_speed(self):
|
||||
"""降低游戏速度"""
|
||||
if self.current_speed < self.MAX_SPEED:
|
||||
self.current_speed = min(self.current_speed + self.SPEED_STEP, self.MAX_SPEED)
|
||||
self.speed_changed.emit(self.current_speed)
|
||||
if self.is_running:
|
||||
self.game_timer.setInterval(self.current_speed)
|
||||
|
||||
def update_game(self):
|
||||
"""更新游戏状态"""
|
||||
if not self.is_running:
|
||||
return
|
||||
|
||||
# 更新方向
|
||||
self.direction = self.next_direction
|
||||
|
||||
# 计算新的头部位置
|
||||
head_x, head_y = self.snake[0]
|
||||
dx, dy = self.direction
|
||||
new_head = (head_x + dx, head_y + dy)
|
||||
|
||||
# 检查碰撞
|
||||
if self.check_collision(new_head):
|
||||
self.is_running = False
|
||||
self.is_game_over = True
|
||||
self.game_timer.stop()
|
||||
self.game_over.emit(self.score)
|
||||
self.update()
|
||||
return
|
||||
|
||||
# 添加新的头部
|
||||
self.snake.insert(0, new_head)
|
||||
|
||||
# 检查是否吃到食物
|
||||
if new_head == self.food:
|
||||
self.score += 10
|
||||
self.score_changed.emit(self.score)
|
||||
self.food = self.generate_food()
|
||||
else:
|
||||
# 移除尾部
|
||||
self.snake.pop()
|
||||
|
||||
self.update()
|
||||
|
||||
def check_collision(self, position):
|
||||
"""检查碰撞"""
|
||||
x, y = position
|
||||
|
||||
# 检查边界碰撞
|
||||
if x < 0 or x >= self.GRID_WIDTH or y < 0 or y >= self.GRID_HEIGHT:
|
||||
return True
|
||||
|
||||
# 检查自身碰撞
|
||||
if position in self.snake:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
"""处理键盘输入"""
|
||||
if event.isAutoRepeat():
|
||||
return
|
||||
|
||||
key = event.key()
|
||||
|
||||
# 使用WASD或方向键控制方向
|
||||
if key in (Qt.Key_W, Qt.Key_Up):
|
||||
# 上键:向上
|
||||
if self.direction != self.DOWN:
|
||||
self.next_direction = self.UP
|
||||
elif key in (Qt.Key_S, Qt.Key_Down):
|
||||
# 下键:向下
|
||||
if self.direction != self.UP:
|
||||
self.next_direction = self.DOWN
|
||||
elif key in (Qt.Key_A, Qt.Key_Left):
|
||||
# 左键:向左(不用于调速)
|
||||
if self.direction != self.RIGHT:
|
||||
self.next_direction = self.LEFT
|
||||
elif key in (Qt.Key_D, Qt.Key_Right):
|
||||
# 右键:向右(不用于调速)
|
||||
if self.direction != self.LEFT:
|
||||
self.next_direction = self.RIGHT
|
||||
elif key == Qt.Key_Space:
|
||||
# 空格键暂停/恢复
|
||||
if self.is_running:
|
||||
self.pause_game()
|
||||
elif not self.is_game_over:
|
||||
self.resume_game()
|
||||
elif key == Qt.Key_R:
|
||||
# R键重新开始
|
||||
if self.is_game_over:
|
||||
self.restart_game()
|
||||
elif key == Qt.Key_Plus or key == Qt.Key_Equal:
|
||||
# + 或 = 键加速
|
||||
self.increase_speed()
|
||||
elif key == Qt.Key_Minus:
|
||||
# - 键减速
|
||||
self.decrease_speed()
|
||||
|
||||
event.accept()
|
||||
|
||||
def paintEvent(self, event):
|
||||
"""绘制游戏"""
|
||||
painter = QPainter(self)
|
||||
painter.setRenderHint(QPainter.Antialiasing)
|
||||
|
||||
# 绘制网格背景
|
||||
self.draw_grid(painter)
|
||||
|
||||
# 绘制食物
|
||||
self.draw_food(painter)
|
||||
|
||||
# 绘制蛇
|
||||
self.draw_snake(painter)
|
||||
|
||||
# 如果游戏结束,显示游戏结束提示
|
||||
if self.is_game_over:
|
||||
self.draw_game_over(painter)
|
||||
|
||||
def draw_grid(self, painter):
|
||||
"""绘制网格"""
|
||||
painter.setPen(QPen(QColor(50, 50, 50), 1))
|
||||
|
||||
# 绘制竖线
|
||||
for x in range(self.GRID_WIDTH + 1):
|
||||
painter.drawLine(
|
||||
x * self.GRID_SIZE, 0,
|
||||
x * self.GRID_SIZE, self.GRID_HEIGHT * self.GRID_SIZE
|
||||
)
|
||||
|
||||
# 绘制横线
|
||||
for y in range(self.GRID_HEIGHT + 1):
|
||||
painter.drawLine(
|
||||
0, y * self.GRID_SIZE,
|
||||
self.GRID_WIDTH * self.GRID_SIZE, y * self.GRID_SIZE
|
||||
)
|
||||
|
||||
def draw_snake(self, painter):
|
||||
"""绘制蛇"""
|
||||
# 绘制蛇身
|
||||
for i, (x, y) in enumerate(self.snake):
|
||||
if i == 0:
|
||||
# 蛇头 - 更亮的绿色
|
||||
painter.fillRect(
|
||||
x * self.GRID_SIZE + 1,
|
||||
y * self.GRID_SIZE + 1,
|
||||
self.GRID_SIZE - 2,
|
||||
self.GRID_SIZE - 2,
|
||||
QColor(0, 255, 0)
|
||||
)
|
||||
# 绘制眼睛
|
||||
painter.fillRect(
|
||||
x * self.GRID_SIZE + 4,
|
||||
y * self.GRID_SIZE + 4,
|
||||
3, 3,
|
||||
QColor(255, 0, 0)
|
||||
)
|
||||
else:
|
||||
# 蛇身 - 稍暗的绿色
|
||||
painter.fillRect(
|
||||
x * self.GRID_SIZE + 1,
|
||||
y * self.GRID_SIZE + 1,
|
||||
self.GRID_SIZE - 2,
|
||||
self.GRID_SIZE - 2,
|
||||
QColor(0, 200, 0)
|
||||
)
|
||||
|
||||
def draw_food(self, painter):
|
||||
"""绘制食物"""
|
||||
x, y = self.food
|
||||
painter.fillRect(
|
||||
x * self.GRID_SIZE + 3,
|
||||
y * self.GRID_SIZE + 3,
|
||||
self.GRID_SIZE - 6,
|
||||
self.GRID_SIZE - 6,
|
||||
QColor(255, 0, 0)
|
||||
)
|
||||
|
||||
def draw_game_over(self, painter):
|
||||
"""绘制游戏结束界面"""
|
||||
# 半透明黑色背景
|
||||
painter.fillRect(self.rect(), QColor(0, 0, 0, 200))
|
||||
|
||||
# 绘制文本
|
||||
painter.setPen(QColor(255, 255, 255))
|
||||
font = QFont("Arial", 30, QFont.Bold)
|
||||
painter.setFont(font)
|
||||
|
||||
text = "游戏结束"
|
||||
fm = painter.fontMetrics()
|
||||
text_width = fm.width(text)
|
||||
text_height = fm.height()
|
||||
|
||||
x = (self.width() - text_width) // 2
|
||||
y = (self.height() - text_height) // 2 - 20
|
||||
|
||||
painter.drawText(x, y, text)
|
||||
|
||||
# 绘制分数
|
||||
font.setPointSize(20)
|
||||
painter.setFont(font)
|
||||
score_text = f"最终分数: {self.score}"
|
||||
fm = painter.fontMetrics()
|
||||
score_width = fm.width(score_text)
|
||||
score_x = (self.width() - score_width) // 2
|
||||
score_y = y + 50
|
||||
|
||||
painter.drawText(score_x, score_y, score_text)
|
||||
|
||||
# 绘制提示
|
||||
font.setPointSize(12)
|
||||
painter.setFont(font)
|
||||
hint_text = "按R键重新开始"
|
||||
fm = painter.fontMetrics()
|
||||
hint_width = fm.width(hint_text)
|
||||
hint_x = (self.width() - hint_width) // 2
|
||||
hint_y = score_y + 40
|
||||
|
||||
painter.drawText(hint_x, hint_y, hint_text)
|
||||
|
||||
|
||||
class SnakeGameWindow(QMainWindow):
|
||||
"""贪吃蛇游戏窗口"""
|
||||
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setWindowTitle("贪吃蛇游戏")
|
||||
self.setGeometry(200, 200, 700, 550)
|
||||
|
||||
# 创建中央控件
|
||||
central_widget = QWidget()
|
||||
self.setCentralWidget(central_widget)
|
||||
|
||||
# 创建布局
|
||||
layout = QVBoxLayout(central_widget)
|
||||
layout.setContentsMargins(10, 10, 10, 10)
|
||||
|
||||
# 创建游戏画布
|
||||
self.game_widget = SnakeGame()
|
||||
layout.addWidget(self.game_widget)
|
||||
|
||||
# 创建控制面板
|
||||
control_layout = QVBoxLayout()
|
||||
|
||||
# 分数标签
|
||||
self.score_label = QLabel("分数: 0")
|
||||
self.score_label.setStyleSheet("font-size: 16px; font-weight: bold;")
|
||||
control_layout.addWidget(self.score_label)
|
||||
|
||||
# 速度标签
|
||||
self.speed_label = QLabel("速度: 正常")
|
||||
self.speed_label.setStyleSheet("font-size: 14px; color: #0066cc;")
|
||||
control_layout.addWidget(self.speed_label)
|
||||
|
||||
# 提示标签
|
||||
self.hint_label = QLabel(
|
||||
"控制方法: W/↑ 上 S/↓ 下 A/← 左 D/→ 右 | 空格暂停 | +/- 调速 | R重新开始"
|
||||
)
|
||||
self.hint_label.setStyleSheet("font-size: 12px; color: gray;")
|
||||
control_layout.addWidget(self.hint_label)
|
||||
|
||||
layout.addLayout(control_layout)
|
||||
|
||||
# 连接信号
|
||||
self.game_widget.score_changed.connect(self.update_score)
|
||||
self.game_widget.game_over.connect(self.on_game_over)
|
||||
self.game_widget.speed_changed.connect(self.update_speed)
|
||||
|
||||
# 设置窗口样式
|
||||
self.setStyleSheet("""
|
||||
QMainWindow {
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
QLabel {
|
||||
color: #333;
|
||||
}
|
||||
""")
|
||||
|
||||
# 启动游戏
|
||||
self.game_widget.start_game()
|
||||
|
||||
def update_score(self, score):
|
||||
"""更新分数显示"""
|
||||
self.score_label.setText(f"分数: {score}")
|
||||
|
||||
def update_speed(self, speed_ms):
|
||||
"""更新速度显示"""
|
||||
# 将毫秒转换为速度等级
|
||||
if speed_ms <= 50:
|
||||
speed_level = "极快"
|
||||
elif speed_ms <= 100:
|
||||
speed_level = "很快"
|
||||
elif speed_ms <= 150:
|
||||
speed_level = "正常"
|
||||
elif speed_ms <= 200:
|
||||
speed_level = "稍慢"
|
||||
else:
|
||||
speed_level = "很慢"
|
||||
|
||||
self.speed_label.setText(f"速度: {speed_level} ({speed_ms}ms)")
|
||||
|
||||
def on_game_over(self, final_score):
|
||||
"""游戏结束处理"""
|
||||
pass # 游戏结束信息已在游戏画布中显示
|
||||
|
||||
def keyPressEvent(self, event):
|
||||
"""处理键盘输入"""
|
||||
if event.key() == Qt.Key_R:
|
||||
self.game_widget.restart_game()
|
||||
else:
|
||||
super().keyPressEvent(event)
|
||||
@ -0,0 +1,269 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
MagicWord 0.2.1 版本测试构建脚本
|
||||
简化版本用于测试功能完整性
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
from datetime import datetime
|
||||
|
||||
def test_imports():
|
||||
"""测试所有依赖是否可以正常导入"""
|
||||
print("测试依赖导入...")
|
||||
|
||||
required_modules = [
|
||||
'PyQt5',
|
||||
'requests',
|
||||
'bs4',
|
||||
'docx',
|
||||
'PyPDF2',
|
||||
'ebooklib',
|
||||
'PIL',
|
||||
'chardet'
|
||||
]
|
||||
|
||||
failed_modules = []
|
||||
|
||||
for module in required_modules:
|
||||
try:
|
||||
if module == 'bs4':
|
||||
import bs4
|
||||
elif module == 'docx':
|
||||
import docx
|
||||
elif module == 'PIL':
|
||||
import PIL
|
||||
else:
|
||||
__import__(module)
|
||||
print(f"✓ {module}")
|
||||
except ImportError as e:
|
||||
print(f"✗ {module}: {e}")
|
||||
failed_modules.append(module)
|
||||
|
||||
if failed_modules:
|
||||
print(f"\n导入失败的模块: {', '.join(failed_modules)}")
|
||||
return False
|
||||
|
||||
print("所有依赖导入成功!")
|
||||
return True
|
||||
|
||||
def test_source_files():
|
||||
"""测试源代码文件是否存在"""
|
||||
print("\n检查源代码文件...")
|
||||
|
||||
required_files = [
|
||||
'src/main.py',
|
||||
'src/main_window.py',
|
||||
'src/ui/word_style_ui.py',
|
||||
'src/file_manager/file_operations.py',
|
||||
'src/input_handler/input_processor.py',
|
||||
'src/services/network_service.py',
|
||||
'resources/icons/app_icon.ico',
|
||||
'resources/config/app_settings.json'
|
||||
]
|
||||
|
||||
missing_files = []
|
||||
|
||||
for file_path in required_files:
|
||||
if os.path.exists(file_path):
|
||||
print(f"✓ {file_path}")
|
||||
else:
|
||||
print(f"✗ {file_path}")
|
||||
missing_files.append(file_path)
|
||||
|
||||
if missing_files:
|
||||
print(f"\n缺失的文件: {', '.join(missing_files)}")
|
||||
return False
|
||||
|
||||
print("所有源代码文件检查通过!")
|
||||
return True
|
||||
|
||||
def test_version_info():
|
||||
"""测试版本信息"""
|
||||
print("\n检查版本信息...")
|
||||
|
||||
# 检查setup.py
|
||||
if os.path.exists('setup.py'):
|
||||
with open('setup.py', 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
if 'version="0.2.1"' in content:
|
||||
print("✓ setup.py 版本号正确")
|
||||
else:
|
||||
print("✗ setup.py 版本号不正确")
|
||||
return False
|
||||
|
||||
# 检查CHANGELOG.md
|
||||
if os.path.exists('CHANGELOG.md'):
|
||||
with open('CHANGELOG.md', 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
if '0.2.1' in content:
|
||||
print("✓ CHANGELOG.md 包含0.2.1版本信息")
|
||||
else:
|
||||
print("✗ CHANGELOG.md 缺少0.2.1版本信息")
|
||||
return False
|
||||
|
||||
print("版本信息检查通过!")
|
||||
return True
|
||||
|
||||
def test_city_mapping():
|
||||
"""测试城市映射功能"""
|
||||
print("\n测试城市映射功能...")
|
||||
|
||||
try:
|
||||
# 直接定义城市映射表进行测试
|
||||
city_id_map = {
|
||||
# 主要城市中文映射
|
||||
'北京': '101010100',
|
||||
'上海': '101020100',
|
||||
'广州': '101280101',
|
||||
'深圳': '101280601',
|
||||
'杭州': '101210101',
|
||||
'南京': '101190101',
|
||||
'成都': '101270101',
|
||||
'武汉': '101200101',
|
||||
'西安': '101110101',
|
||||
'重庆': '101040100',
|
||||
'天津': '101030100',
|
||||
'苏州': '101190401',
|
||||
'青岛': '101120201',
|
||||
'大连': '101070201',
|
||||
'沈阳': '101070101',
|
||||
'哈尔滨': '101050101',
|
||||
'长春': '101060101',
|
||||
'石家庄': '101090101',
|
||||
'太原': '101100101',
|
||||
'郑州': '101180101',
|
||||
'济南': '101120101',
|
||||
'合肥': '101220101',
|
||||
'南昌': '101240101',
|
||||
'长沙': '101250101',
|
||||
'福州': '101230101',
|
||||
'厦门': '101230201',
|
||||
'南宁': '101300101',
|
||||
'海口': '101310101',
|
||||
'贵阳': '101260101',
|
||||
'昆明': '101290101',
|
||||
'拉萨': '101140101',
|
||||
'兰州': '101160101',
|
||||
'西宁': '101150101',
|
||||
'银川': '101170101',
|
||||
'乌鲁木齐': '101130101',
|
||||
'呼和浩特': '101080101',
|
||||
|
||||
# 英文城市名映射到中文
|
||||
'Beijing': '北京',
|
||||
'Shanghai': '上海',
|
||||
'Guangzhou': '广州',
|
||||
'Shenzhen': '深圳',
|
||||
'Hangzhou': '杭州',
|
||||
'Nanjing': '南京',
|
||||
'Chengdu': '成都',
|
||||
'Wuhan': '武汉',
|
||||
'Xian': '西安',
|
||||
'Chongqing': '重庆',
|
||||
'Tianjin': '天津',
|
||||
'Suzhou': '苏州',
|
||||
'Qingdao': '青岛',
|
||||
'Dalian': '大连',
|
||||
'Shenyang': '沈阳',
|
||||
'Harbin': '哈尔滨',
|
||||
'Changchun': '长春',
|
||||
'Shijiazhuang': '石家庄',
|
||||
'Taiyuan': '太原',
|
||||
'Zhengzhou': '郑州',
|
||||
'Jinan': '济南',
|
||||
'Hefei': '合肥',
|
||||
'Nanchang': '南昌',
|
||||
'Changsha': '长沙',
|
||||
'Fuzhou': '福州',
|
||||
'Xiamen': '厦门',
|
||||
'Nanning': '南宁',
|
||||
'Haikou': '海口',
|
||||
'Guiyang': '贵阳',
|
||||
'Kunming': '昆明',
|
||||
'Lhasa': '拉萨',
|
||||
'Lanzhou': '兰州',
|
||||
'Xining': '西宁',
|
||||
'Yinchuan': '银川',
|
||||
'Urumqi': '乌鲁木齐',
|
||||
'Hohhot': '呼和浩特'
|
||||
}
|
||||
|
||||
# 检查一些主要城市
|
||||
test_cities = [
|
||||
('Beijing', '北京'),
|
||||
('Shanghai', '上海'),
|
||||
('Guangzhou', '广州'),
|
||||
('Shenzhen', '深圳'),
|
||||
('Chengdu', '成都'),
|
||||
('Hangzhou', '杭州')
|
||||
]
|
||||
|
||||
for eng_name, chn_name in test_cities:
|
||||
if eng_name in city_id_map:
|
||||
mapped_name = city_id_map[eng_name]
|
||||
if mapped_name == chn_name:
|
||||
print(f"✓ {eng_name} -> {mapped_name}")
|
||||
else:
|
||||
print(f"⚠ {eng_name} -> {mapped_name} (期望: {chn_name})")
|
||||
else:
|
||||
print(f"✗ {eng_name} 未找到映射")
|
||||
|
||||
print(f"城市映射表包含 {len(city_id_map)} 个城市")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"城市映射测试失败: {e}")
|
||||
return False
|
||||
|
||||
def create_test_report():
|
||||
"""创建测试报告"""
|
||||
print("\n" + "="*60)
|
||||
print("MagicWord 0.2.1 版本功能测试报告")
|
||||
print("="*60)
|
||||
print(f"测试时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
||||
|
||||
tests = [
|
||||
("依赖导入测试", test_imports),
|
||||
("源代码文件检查", test_source_files),
|
||||
("版本信息检查", test_version_info),
|
||||
("城市映射功能测试", test_city_mapping)
|
||||
]
|
||||
|
||||
passed = 0
|
||||
total = len(tests)
|
||||
|
||||
for test_name, test_func in tests:
|
||||
print(f"\n[{test_name}]")
|
||||
if test_func():
|
||||
passed += 1
|
||||
print(f"✓ {test_name} 通过")
|
||||
else:
|
||||
print(f"✗ {test_name} 失败")
|
||||
|
||||
print(f"\n测试结果: {passed}/{total} 通过")
|
||||
|
||||
if passed == total:
|
||||
print("\n✓ 所有测试通过! 版本准备就绪")
|
||||
return True
|
||||
else:
|
||||
print(f"\n✗ {total - passed} 个测试失败, 需要修复")
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
success = create_test_report()
|
||||
|
||||
if success:
|
||||
print("\n建议下一步:")
|
||||
print("1. 运行应用进行手动测试")
|
||||
print("2. 创建发布包")
|
||||
else:
|
||||
print("\n请先修复测试中发现的问题")
|
||||
|
||||
return 0 if success else 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
测试字体颜色功能的简单脚本
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
|
||||
|
||||
from PyQt5.QtWidgets import QApplication, QTextEdit, QPushButton, QVBoxLayout, QWidget, QColorDialog
|
||||
from PyQt5.QtGui import QColor, QTextCharFormat, QTextCursor
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
def test_color_function():
|
||||
"""测试字体颜色功能"""
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
# 创建主窗口
|
||||
window = QWidget()
|
||||
window.setWindowTitle("字体颜色测试")
|
||||
window.setGeometry(100, 100, 400, 300)
|
||||
|
||||
# 创建文本编辑器
|
||||
text_edit = QTextEdit()
|
||||
text_edit.setPlainText("这是一段测试文本。请选择这段文字并点击颜色按钮来更改颜色。")
|
||||
|
||||
# 创建颜色按钮
|
||||
color_btn = QPushButton("选择颜色")
|
||||
|
||||
def change_color():
|
||||
"""更改字体颜色"""
|
||||
color = QColorDialog.getColor(Qt.black, window, "选择字体颜色")
|
||||
if color.isValid():
|
||||
cursor = text_edit.textCursor()
|
||||
if cursor.hasSelection():
|
||||
# 如果有选中文本,只更改选中文本的颜色
|
||||
fmt = cursor.charFormat()
|
||||
fmt.setForeground(color)
|
||||
cursor.setCharFormat(fmt)
|
||||
print(f"已更改选中文本颜色为: {color.name()}")
|
||||
else:
|
||||
# 如果没有选中文本,更改整个文档的默认颜色
|
||||
text_edit.setTextColor(color)
|
||||
print(f"已更改默认文本颜色为: {color.name()}")
|
||||
|
||||
color_btn.clicked.connect(change_color)
|
||||
|
||||
# 布局
|
||||
layout = QVBoxLayout()
|
||||
layout.addWidget(text_edit)
|
||||
layout.addWidget(color_btn)
|
||||
|
||||
window.setLayout(layout)
|
||||
window.show()
|
||||
|
||||
print("字体颜色测试窗口已打开")
|
||||
print("操作说明:")
|
||||
print("1. 在文本编辑器中选择一些文字")
|
||||
print("2. 点击'选择颜色'按钮")
|
||||
print("3. 选择颜色并确认")
|
||||
print("4. 观察选中文本的颜色是否改变")
|
||||
|
||||
sys.exit(app.exec_())
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_color_function()
|
||||
@ -0,0 +1,78 @@
|
||||
# 字体颜色功能测试脚本 - 验证保留之前内容的颜色
|
||||
import sys
|
||||
from PyQt5.QtWidgets import QApplication, QTextEdit, QPushButton, QVBoxLayout, QWidget, QColorDialog
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QColor, QTextCharFormat, QFont
|
||||
|
||||
class ColorTestWindow(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("字体颜色功能测试 - 保留之前内容的颜色")
|
||||
self.setGeometry(100, 100, 600, 400)
|
||||
|
||||
layout = QVBoxLayout()
|
||||
|
||||
# 创建文本编辑器
|
||||
self.text_edit = QTextEdit()
|
||||
self.text_edit.setPlainText("这是一段测试文本。\n这行文字将保持原有颜色。\n新输入的文字将使用新颜色。")
|
||||
|
||||
# 设置一些初始颜色来模拟原有内容
|
||||
cursor = self.text_edit.textCursor()
|
||||
cursor.select(cursor.Document)
|
||||
cursor.setPosition(0)
|
||||
|
||||
# 给第一行设置红色
|
||||
cursor.movePosition(cursor.StartOfLine)
|
||||
cursor.movePosition(cursor.EndOfLine, cursor.KeepAnchor)
|
||||
fmt = QTextCharFormat()
|
||||
fmt.setForeground(QColor("red"))
|
||||
cursor.setCharFormat(fmt)
|
||||
|
||||
# 给第二行设置蓝色
|
||||
cursor.movePosition(cursor.NextBlock)
|
||||
cursor.movePosition(cursor.EndOfLine, cursor.KeepAnchor)
|
||||
fmt.setForeground(QColor("blue"))
|
||||
cursor.setCharFormat(fmt)
|
||||
|
||||
layout.addWidget(self.text_edit)
|
||||
|
||||
# 创建颜色选择按钮
|
||||
self.color_btn = QPushButton("选择新颜色(保留原有内容颜色)")
|
||||
self.color_btn.clicked.connect(self.on_color_clicked)
|
||||
layout.addWidget(self.color_btn)
|
||||
|
||||
# 创建说明标签
|
||||
self.info_label = QLabel("点击按钮选择颜色,新输入的文本将使用新颜色,原有内容颜色保持不变")
|
||||
layout.addWidget(self.info_label)
|
||||
|
||||
self.setLayout(layout)
|
||||
|
||||
def on_color_clicked(self):
|
||||
"""字体颜色按钮点击处理 - 保留之前内容的颜色"""
|
||||
# 显示颜色选择对话框,默认使用当前文本颜色
|
||||
current_color = self.text_edit.textColor()
|
||||
color = QColorDialog.getColor(current_color, self, "选择字体颜色")
|
||||
|
||||
if color.isValid():
|
||||
# 只设置后续输入的默认颜色,不影响已有内容
|
||||
self.text_edit.setTextColor(color)
|
||||
|
||||
# 如果有选中文本,提示用户颜色只对新输入生效
|
||||
cursor = self.text_edit.textCursor()
|
||||
if cursor.hasSelection():
|
||||
self.info_label.setText("字体颜色已设置,新输入的文本将使用该颜色(原有内容颜色保持不变)")
|
||||
else:
|
||||
self.info_label.setText(f"新颜色已设置: {color.name()},后续输入将使用该颜色")
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication(sys.argv)
|
||||
window = ColorTestWindow()
|
||||
window.show()
|
||||
|
||||
print("测试说明:")
|
||||
print("1. 文本编辑器中有三行文字,第一行红色,第二行蓝色,第三行默认黑色")
|
||||
print("2. 点击颜色选择按钮选择新颜色")
|
||||
print("3. 在文本末尾输入新文字,观察新文字使用新颜色而原有文字颜色不变")
|
||||
print("4. 测试验证:保留之前内容的颜色功能是否正常工作")
|
||||
|
||||
sys.exit(app.exec_())
|
||||
@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加src目录到Python路径
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
|
||||
|
||||
from ui.word_style_ui import daily_sentence_API
|
||||
from services.network_service import NetworkService
|
||||
|
||||
def test_daily_sentence_api():
|
||||
print("测试 daily_sentence_API 类...")
|
||||
try:
|
||||
# 使用与Ribbon界面相同的API获取每日一言
|
||||
quote_api = daily_sentence_API("https://api.nxvav.cn/api/yiyan")
|
||||
quote_data = quote_api.get_sentence('json')
|
||||
|
||||
print("API返回的数据:")
|
||||
print(quote_data)
|
||||
|
||||
# 处理获取到的数据
|
||||
if quote_data and isinstance(quote_data, dict):
|
||||
quote_text = quote_data.get('yiyan', '暂无每日一言')
|
||||
print(f"解析后的每日一言: {quote_text}")
|
||||
else:
|
||||
print("获取每日一言失败")
|
||||
|
||||
except Exception as e:
|
||||
print(f"测试 daily_sentence_API 类时出错: {e}")
|
||||
|
||||
def test_network_service_quote():
|
||||
print("\n测试 NetworkService 类的 get_daily_quote 方法...")
|
||||
try:
|
||||
network_service = NetworkService()
|
||||
quote = network_service.get_daily_quote()
|
||||
print(f"NetworkService 获取的每日一言: {quote}")
|
||||
except Exception as e:
|
||||
print(f"测试 NetworkService 类时出错: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_daily_sentence_api()
|
||||
test_network_service_quote()
|
||||
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python3
|
||||
# test_snake_game.py
|
||||
"""测试贪吃蛇游戏"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加项目根目录到Python路径
|
||||
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||
sys.path.insert(0, project_root)
|
||||
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from src.ui.snake_game import SnakeGameWindow
|
||||
|
||||
def main():
|
||||
app = QApplication(sys.argv)
|
||||
game_window = SnakeGameWindow()
|
||||
game_window.show()
|
||||
sys.exit(app.exec_())
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -0,0 +1,71 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
测试贪吃蛇游戏的速度调节功能
|
||||
"""
|
||||
|
||||
import sys
|
||||
sys.path.insert(0, '/Users/maziang/Documents/CodingWorkPlace/Code/Curriculum_Design')
|
||||
|
||||
from src.ui.snake_game import SnakeGame, SnakeGameWindow
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtGui import QKeyEvent
|
||||
|
||||
def test_snake_game():
|
||||
"""测试贪吃蛇游戏"""
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
# 创建游戏窗口
|
||||
window = SnakeGameWindow()
|
||||
window.show()
|
||||
|
||||
# 获取游戏实例
|
||||
game = window.game_widget
|
||||
|
||||
# 测试初始速度
|
||||
print(f"初始速度: {game.current_speed}ms")
|
||||
assert game.current_speed == game.GAME_SPEED, "初始速度应该是150ms"
|
||||
|
||||
# 测试增加速度(按上键)
|
||||
print("\n测试增加速度...")
|
||||
initial_speed = game.current_speed
|
||||
game.increase_speed()
|
||||
print(f"按上键后速度: {game.current_speed}ms (从 {initial_speed}ms)")
|
||||
assert game.current_speed < initial_speed, "速度应该增加(毫秒数减少)"
|
||||
|
||||
# 测试降低速度(按下键)
|
||||
print("\n测试降低速度...")
|
||||
current_speed = game.current_speed
|
||||
game.decrease_speed()
|
||||
print(f"按下键后速度: {game.current_speed}ms (从 {current_speed}ms)")
|
||||
assert game.current_speed > current_speed, "速度应该降低(毫秒数增加)"
|
||||
|
||||
# 测试速度限制
|
||||
print("\n测试速度限制...")
|
||||
|
||||
# 测试最小速度限制
|
||||
game.current_speed = game.MIN_SPEED
|
||||
game.increase_speed()
|
||||
print(f"最小速度限制测试: {game.current_speed}ms (应该 >= {game.MIN_SPEED}ms)")
|
||||
assert game.current_speed >= game.MIN_SPEED, "速度不应该低于最小值"
|
||||
|
||||
# 测试最大速度限制
|
||||
game.current_speed = game.MAX_SPEED
|
||||
game.decrease_speed()
|
||||
print(f"最大速度限制测试: {game.current_speed}ms (应该 <= {game.MAX_SPEED}ms)")
|
||||
assert game.current_speed <= game.MAX_SPEED, "速度不应该超过最大值"
|
||||
|
||||
print("\n✓ 所有测试通过!")
|
||||
print(f"速度范围: {game.MIN_SPEED}ms - {game.MAX_SPEED}ms")
|
||||
print(f"速度步长: {game.SPEED_STEP}ms")
|
||||
|
||||
window.close()
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
test_snake_game()
|
||||
except Exception as e:
|
||||
print(f"✗ 测试失败: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
sys.exit(1)
|
||||
@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
简化测试脚本 - 验证学习模式内容同步功能
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'src'))
|
||||
|
||||
from PyQt5.QtWidgets import QApplication, QTextEdit, QVBoxLayout, QWidget
|
||||
from learning_mode_window import LearningModeWindow
|
||||
|
||||
class TestWindow(QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.setWindowTitle("测试主窗口")
|
||||
self.setGeometry(100, 100, 600, 400)
|
||||
|
||||
# 创建布局
|
||||
layout = QVBoxLayout()
|
||||
|
||||
# 创建文本编辑器
|
||||
self.text_edit = QTextEdit()
|
||||
self.text_edit.setPlainText("初始内容\n")
|
||||
layout.addWidget(self.text_edit)
|
||||
|
||||
self.setLayout(layout)
|
||||
|
||||
# 创建学习模式窗口
|
||||
self.learning_window = LearningModeWindow(parent=self)
|
||||
self.learning_window.imported_content = "这是一段测试内容。"
|
||||
self.learning_window.current_position = 0
|
||||
self.learning_window.show()
|
||||
|
||||
# 连接内容同步信号
|
||||
self.learning_window.content_changed.connect(self.on_content_changed)
|
||||
|
||||
print("测试开始...")
|
||||
print(f"主窗口内容: {repr(self.text_edit.toPlainText())}")
|
||||
print(f"学习窗口内容: {repr(self.learning_window.imported_content)}")
|
||||
print(f"学习窗口当前位置: {self.learning_window.current_position}")
|
||||
|
||||
# 模拟用户输入正确内容
|
||||
print("\n模拟用户输入正确内容...")
|
||||
self.learning_window.current_position = 3 # 用户输入了3个字符
|
||||
self.learning_window.on_text_changed() # 调用文本变化处理
|
||||
|
||||
def on_content_changed(self, new_content, position):
|
||||
"""内容同步回调"""
|
||||
print(f"收到内容同步信号: new_content={repr(new_content)}, position={position}")
|
||||
# 在文本编辑器末尾添加新内容
|
||||
current_text = self.text_edit.toPlainText()
|
||||
self.text_edit.setPlainText(current_text + new_content)
|
||||
print(f"主窗口更新后内容: {repr(self.text_edit.toPlainText())}")
|
||||
|
||||
def test_content_sync():
|
||||
"""测试内容同步功能"""
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
test_window = TestWindow()
|
||||
test_window.show()
|
||||
|
||||
print("\n测试完成!")
|
||||
|
||||
# 运行应用
|
||||
sys.exit(app.exec_())
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_content_sync()
|
||||
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
测试天气生活提示功能
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 添加src目录到路径
|
||||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'src'))
|
||||
|
||||
from services.network_service import NetworkService
|
||||
|
||||
def test_weather_with_lifetips():
|
||||
"""测试包含生活提示的天气功能"""
|
||||
print("🌤 测试天气生活提示功能")
|
||||
print("=" * 50)
|
||||
|
||||
# 创建网络服务实例
|
||||
network_service = NetworkService()
|
||||
|
||||
# 获取天气信息
|
||||
print("正在获取天气信息...")
|
||||
weather_info = network_service.get_weather_info()
|
||||
|
||||
if weather_info:
|
||||
print(f"✅ 成功获取天气数据:")
|
||||
print(f"城市: {weather_info['city']}")
|
||||
print(f"温度: {weather_info['temperature']}°C")
|
||||
print(f"天气: {weather_info['description']}")
|
||||
print(f"湿度: {weather_info['humidity']}%")
|
||||
print(f"风速: {weather_info['wind_speed']}m/s")
|
||||
|
||||
# 显示生活提示
|
||||
lifetips = weather_info.get('lifetips', [])
|
||||
if lifetips:
|
||||
print(f"\n🌟 生活提示 ({len(lifetips)}条):")
|
||||
for i, tip in enumerate(lifetips, 1):
|
||||
print(f" {i}. {tip}")
|
||||
else:
|
||||
print("⚠️ 未获取到生活提示")
|
||||
|
||||
# 模拟显示详细信息格式
|
||||
print(f"\n📋 详细信息显示格式:")
|
||||
weather_text = f"{weather_info['city']}: {weather_info['temperature']}°C, {weather_info['description']}"
|
||||
weather_text += f"\n湿度: {weather_info['humidity']}%"
|
||||
weather_text += f"\n风速: {weather_info['wind_speed']}m/s"
|
||||
|
||||
if lifetips:
|
||||
weather_text += "\n\n🌟 生活提示:"
|
||||
for tip in lifetips:
|
||||
weather_text += f"\n• {tip}"
|
||||
|
||||
print(weather_text)
|
||||
|
||||
else:
|
||||
print("❌ 获取天气信息失败")
|
||||
|
||||
print("\n" + "=" * 50)
|
||||
print("测试完成!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
test_weather_with_lifetips()
|
||||