add 项目运行截图
This commit is contained in:
534
gui.py
534
gui.py
@@ -15,6 +15,7 @@ from step2 import Step2Converter
|
||||
from editor_gui import open_editor
|
||||
from markdown_editor import ThemeManager
|
||||
from db_manager import get_db_manager, reset_db_manager, ProjectOrder
|
||||
from project_screenshot import ProjectScreenshotAutomation, ProjectConfig
|
||||
|
||||
|
||||
class YidaimaGUI:
|
||||
@@ -86,7 +87,12 @@ class YidaimaGUI:
|
||||
self.tab_manage = ttk.Frame(self.notebook, padding="10")
|
||||
self.notebook.add(self.tab_manage, text="文章发布管理")
|
||||
self._create_manage_tab()
|
||||
|
||||
|
||||
# === Tab 3: 项目运行截图 ===
|
||||
self.tab_screenshot = ttk.Frame(self.notebook, padding="10")
|
||||
self.notebook.add(self.tab_screenshot, text="项目运行截图")
|
||||
self._create_screenshot_tab()
|
||||
|
||||
# === Tab 4: 参数设置 ===
|
||||
self.tab_settings = ttk.Frame(self.notebook, padding="10")
|
||||
self.notebook.add(self.tab_settings, text="参数设置")
|
||||
@@ -756,6 +762,532 @@ class YidaimaGUI:
|
||||
self.setting_db_user_var.set(self.config.get("database.user", "root"))
|
||||
self.setting_db_pass_var.set(self.config.get("database.password", "123456"))
|
||||
|
||||
# ==================== 项目运行截图 Tab 方法 ====================
|
||||
|
||||
def _create_screenshot_tab(self):
|
||||
"""创建项目运行截图 Tab"""
|
||||
# 配置网格
|
||||
self.tab_screenshot.columnconfigure(0, weight=1)
|
||||
self.tab_screenshot.rowconfigure(3, weight=1)
|
||||
|
||||
# 获取项目截图配置
|
||||
ps_config = self.config.get("project_screenshot", {})
|
||||
|
||||
# === 项目路径配置区域 ===
|
||||
path_frame = ttk.LabelFrame(self.tab_screenshot, text="项目路径配置", padding="10")
|
||||
path_frame.grid(row=0, column=0, sticky=(tk.W, tk.E), pady=(0, 10))
|
||||
path_frame.columnconfigure(1, weight=1)
|
||||
|
||||
# 项目路径
|
||||
ttk.Label(path_frame, text="项目路径:").grid(row=0, column=0, sticky=tk.W)
|
||||
self.ps_project_path_var = tk.StringVar(value=ps_config.get("project_path", ""))
|
||||
ps_project_path_entry = ttk.Entry(path_frame, textvariable=self.ps_project_path_var, width=60)
|
||||
ps_project_path_entry.grid(row=0, column=1, sticky=(tk.W, tk.E), padx=(10, 0))
|
||||
ttk.Button(path_frame, text="浏览...", command=self._browse_project_path, width=10).grid(row=0, column=2, padx=(10, 0))
|
||||
|
||||
# 桌面路径
|
||||
ttk.Label(path_frame, text="桌面路径:").grid(row=1, column=0, sticky=tk.W, pady=(10, 0))
|
||||
self.ps_desktop_path_var = tk.StringVar(value=ps_config.get("desktop_path", r"C:\Users\南音\Desktop"))
|
||||
ps_desktop_path_entry = ttk.Entry(path_frame, textvariable=self.ps_desktop_path_var, width=60)
|
||||
ps_desktop_path_entry.grid(row=1, column=1, sticky=(tk.W, tk.E), padx=(10, 0), pady=(10, 0))
|
||||
|
||||
# bat 文件夹名称
|
||||
ttk.Label(path_frame, text="bat文件夹:").grid(row=2, column=0, sticky=tk.W, pady=(10, 0))
|
||||
self.ps_bat_folder_var = tk.StringVar(value=ps_config.get("bat_folder", r"C:\Users\南音\Desktop\yidaima\bat"))
|
||||
ps_bat_folder_entry = ttk.Entry(path_frame, textvariable=self.ps_bat_folder_var, width=60)
|
||||
ps_bat_folder_entry.grid(row=2, column=1, sticky=(tk.W, tk.E), padx=(10, 0), pady=(10, 0))
|
||||
|
||||
# 代码目标路径
|
||||
ttk.Label(path_frame, text="代码目标路径:").grid(row=3, column=0, sticky=tk.W, pady=(10, 0))
|
||||
self.ps_code_target_var = tk.StringVar(value=ps_config.get("code_target_path", r"D:\code"))
|
||||
ps_code_target_entry = ttk.Entry(path_frame, textvariable=self.ps_code_target_var, width=60)
|
||||
ps_code_target_entry.grid(row=3, column=1, sticky=(tk.W, tk.E), padx=(10, 0), pady=(10, 0))
|
||||
|
||||
# 是否有前台前端
|
||||
self.ps_has_front_var = tk.BooleanVar(value=ps_config.get("has_front", True))
|
||||
ttk.Checkbutton(path_frame, text="有前台前端", variable=self.ps_has_front_var).grid(row=4, column=1, sticky=tk.W, padx=(10, 0), pady=(10, 0))
|
||||
|
||||
# 是否显示 CMD 窗口
|
||||
self.ps_show_cmd_var = tk.BooleanVar(value=ps_config.get("show_cmd_window", True))
|
||||
ttk.Checkbutton(path_frame, text="显示CMD窗口", variable=self.ps_show_cmd_var).grid(row=5, column=1, sticky=tk.W, padx=(10, 0), pady=(10, 0))
|
||||
|
||||
# === 操作按钮区域 ===
|
||||
button_frame = ttk.LabelFrame(self.tab_screenshot, text="操作按钮", padding="10")
|
||||
button_frame.grid(row=1, column=0, sticky=(tk.W, tk.E), pady=(0, 10))
|
||||
|
||||
# 构建/安装按钮
|
||||
install_frame = ttk.Frame(button_frame)
|
||||
install_frame.pack(fill=tk.X, pady=(0, 10))
|
||||
|
||||
ttk.Button(install_frame, text="整理代码", command=self._ps_organize_code, width=15).pack(side=tk.LEFT, padx=(0, 5))
|
||||
ttk.Button(install_frame, text="Maven构建后端", command=self._ps_install_server, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(install_frame, text="安装前台依赖", command=self._ps_install_front, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(install_frame, text="安装后台依赖", command=self._ps_install_admin, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(install_frame, text="导入SQL", command=self._ps_run_sql, width=15).pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
# 启动按钮
|
||||
start_frame = ttk.Frame(button_frame)
|
||||
start_frame.pack(fill=tk.X, pady=(0, 10))
|
||||
|
||||
ttk.Button(start_frame, text="启动后端服务", command=self._ps_start_server, width=15).pack(side=tk.LEFT, padx=(0, 5))
|
||||
ttk.Button(start_frame, text="启动前台前端", command=self._ps_start_front, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(start_frame, text="启动后台前端", command=self._ps_start_admin, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(start_frame, text="更换图片", command=self._ps_replace_images, width=15).pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
# 截图按钮
|
||||
screenshot_frame = ttk.Frame(button_frame)
|
||||
screenshot_frame.pack(fill=tk.X)
|
||||
|
||||
ttk.Button(screenshot_frame, text="后台截图", command=self._ps_capture_admin, width=15).pack(side=tk.LEFT, padx=(0, 5))
|
||||
ttk.Button(screenshot_frame, text="前台截图", command=self._ps_capture_front, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(screenshot_frame, text="收尾工作", command=self._ps_finalize_screenshots, width=15).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(screenshot_frame, text="一键完整流程", command=self._ps_run_full_flow, width=20).pack(side=tk.LEFT, padx=(5, 5))
|
||||
ttk.Button(screenshot_frame, text="关闭所有CMD", command=self._ps_close_all_cmd, width=15).pack(side=tk.LEFT, padx=(5, 0))
|
||||
|
||||
# === 日志输出区域 ===
|
||||
log_frame = ttk.LabelFrame(self.tab_screenshot, text="运行日志", padding="10")
|
||||
log_frame.grid(row=2, column=0, sticky=(tk.W, tk.E, tk.N, tk.S), pady=(10, 0))
|
||||
log_frame.columnconfigure(0, weight=1)
|
||||
log_frame.rowconfigure(0, weight=1)
|
||||
|
||||
self.ps_log_text = scrolledtext.ScrolledText(
|
||||
log_frame,
|
||||
wrap=tk.WORD,
|
||||
width=80,
|
||||
height=15,
|
||||
font=("Consolas", 9)
|
||||
)
|
||||
self.ps_log_text.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))
|
||||
|
||||
# 进度条
|
||||
self.ps_progress = ttk.Progressbar(
|
||||
self.tab_screenshot,
|
||||
mode='indeterminate',
|
||||
length=400
|
||||
)
|
||||
self.ps_progress.grid(row=3, column=0, pady=(10, 0), sticky=(tk.W, tk.E))
|
||||
|
||||
# 状态标签
|
||||
self.ps_status_var = tk.StringVar(value="就绪")
|
||||
self.ps_status_label = ttk.Label(
|
||||
self.tab_screenshot,
|
||||
textvariable=self.ps_status_var,
|
||||
foreground="#666"
|
||||
)
|
||||
self.ps_status_label.grid(row=4, column=0, pady=(10, 0))
|
||||
|
||||
def _browse_project_path(self):
|
||||
"""浏览项目路径"""
|
||||
from tkinter import filedialog
|
||||
path = filedialog.askdirectory(title="选择项目文件夹")
|
||||
if path:
|
||||
self.ps_project_path_var.set(path)
|
||||
|
||||
def _ps_log(self, message: str):
|
||||
"""添加项目截图日志"""
|
||||
self.ps_log_text.insert(tk.END, f"{message}\n")
|
||||
self.ps_log_text.see(tk.END)
|
||||
self.root.update_idletasks()
|
||||
|
||||
def _get_ps_config(self) -> ProjectConfig:
|
||||
"""获取项目截图配置"""
|
||||
ps_config = self.config.get("project_screenshot", {})
|
||||
return ProjectConfig(
|
||||
project_path=self.ps_project_path_var.get(),
|
||||
desktop_path=self.ps_desktop_path_var.get(),
|
||||
has_front=self.ps_has_front_var.get(),
|
||||
install_server=ps_config.get("scripts", {}).get("install_server", "run_install_server.bat"),
|
||||
install_front=ps_config.get("scripts", {}).get("install_front", "run_install_front.bat"),
|
||||
install_admin=ps_config.get("scripts", {}).get("install_admin", "run_install_admin.bat"),
|
||||
run_server=ps_config.get("scripts", {}).get("run_server", "run_server.bat"),
|
||||
run_front=ps_config.get("scripts", {}).get("run_front", "run_front.bat"),
|
||||
run_admin=ps_config.get("scripts", {}).get("run_admin", "run_admin.bat"),
|
||||
run_sql=ps_config.get("scripts", {}).get("run_sql", "run_sql.bat"),
|
||||
bat_folder=self.ps_bat_folder_var.get(),
|
||||
sql_script_path=ps_config.get("sql", {}).get("script_path", "server/db/init.sql"),
|
||||
backend_url=ps_config.get("services", {}).get("backend", {}).get("url", "http://localhost:8080"),
|
||||
backend_startup_timeout=ps_config.get("services", {}).get("backend", {}).get("startup_timeout", 120),
|
||||
front_url=ps_config.get("services", {}).get("front", {}).get("url", "http://localhost:8082"),
|
||||
front_login_url=ps_config.get("services", {}).get("front", {}).get("login_url", "http://localhost:8082/#/login"),
|
||||
front_startup_timeout=ps_config.get("services", {}).get("front", {}).get("startup_timeout", 60),
|
||||
admin_url=ps_config.get("services", {}).get("admin", {}).get("url", "http://localhost:8081"),
|
||||
admin_login_url=ps_config.get("services", {}).get("admin", {}).get("login_url", "http://localhost:8081/#/login"),
|
||||
admin_startup_timeout=ps_config.get("services", {}).get("admin", {}).get("startup_timeout", 60),
|
||||
admin_username=ps_config.get("login", {}).get("admin", {}).get("username", "admin"),
|
||||
admin_password=ps_config.get("login", {}).get("admin", {}).get("password", "admin"),
|
||||
front_username=ps_config.get("login", {}).get("front", {}).get("username", "2"),
|
||||
front_password=ps_config.get("login", {}).get("front", {}).get("password", "123456"),
|
||||
screenshot_output_dir=ps_config.get("screenshot", {}).get("output_dir", "./screenshots"),
|
||||
screenshot_delay=ps_config.get("screenshot", {}).get("delay", 2000),
|
||||
admin_menu_selector=ps_config.get("screenshot", {}).get("menu_selectors", {}).get("admin", ".el-menu-item, .el-sub-menu__title"),
|
||||
front_menu_selector=ps_config.get("screenshot", {}).get("menu_selectors", {}).get("front", ".nav-item, .menu-item"),
|
||||
swiper_source_folder=ps_config.get("swiper_images", {}).get("source_folder", "bg_pic"),
|
||||
swiper_target_subpath=ps_config.get("swiper_images", {}).get("target_subpath", "server/src/main/resources/static/file"),
|
||||
swiper_target_names=ps_config.get("swiper_images", {}).get("target_names", ["swiperPicture1.jpg", "swiperPicture2.jpg", "swiperPicture3.jpg"]),
|
||||
swiper_count=ps_config.get("swiper_images", {}).get("count", 3),
|
||||
login_vue_subpath=ps_config.get("login_background", {}).get("vue_file_subpath", "front/manage_code/src/views/login.vue"),
|
||||
login_background_images=ps_config.get("login_background", {}).get("images", []),
|
||||
code_source_folder=ps_config.get("code_source_folder", "code"),
|
||||
code_target_path=self.ps_code_target_var.get(),
|
||||
show_cmd_window=self.ps_show_cmd_var.get()
|
||||
)
|
||||
|
||||
def _ps_set_running(self, running: bool):
|
||||
"""设置项目截图运行状态"""
|
||||
if running:
|
||||
self.ps_progress.start()
|
||||
self.ps_status_var.set("运行中...")
|
||||
else:
|
||||
self.ps_progress.stop()
|
||||
self.ps_status_var.set("就绪")
|
||||
|
||||
def _ps_install_server(self):
|
||||
"""Maven 构建后端"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始 Maven 构建后端...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
success, msg = automation.install_server()
|
||||
if success:
|
||||
self._ps_log("Maven 构建完成!")
|
||||
else:
|
||||
self._ps_log(f"构建失败: {msg}")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_install_front(self):
|
||||
"""安装前台前端依赖"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始安装前台前端依赖...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
success, msg = automation.install_front()
|
||||
if success:
|
||||
self._ps_log("前台依赖安装完成!")
|
||||
else:
|
||||
self._ps_log(f"安装失败: {msg}")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_install_admin(self):
|
||||
"""安装后台前端依赖"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始安装后台前端依赖...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
success, msg = automation.install_admin()
|
||||
if success:
|
||||
self._ps_log("后台依赖安装完成!")
|
||||
else:
|
||||
self._ps_log(f"安装失败: {msg}")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_run_sql(self):
|
||||
"""导入 SQL 脚本"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始导入 SQL...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
success, msg = automation.run_sql_script()
|
||||
if success:
|
||||
self._ps_log("SQL 导入完成!")
|
||||
else:
|
||||
self._ps_log(f"导入失败: {msg}")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_start_server(self):
|
||||
"""启动后端服务"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("启动后端服务...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
automation.start_backend()
|
||||
if automation.wait_for_service(config.backend_url, config.backend_startup_timeout):
|
||||
self._ps_log("后端服务启动成功!")
|
||||
else:
|
||||
self._ps_log("后端服务启动超时,请手动检查")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_start_front(self):
|
||||
"""启动前台前端"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("启动前台前端...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
automation.start_front()
|
||||
if automation.wait_for_service(config.front_url, config.front_startup_timeout):
|
||||
self._ps_log("前台前端启动成功!")
|
||||
else:
|
||||
self._ps_log("前台前端启动超时,请手动检查")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_organize_code(self):
|
||||
"""整理项目代码"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始整理项目代码...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
sql_filename = automation.organize_project_code()
|
||||
if sql_filename:
|
||||
self._ps_log(f"代码整理完成!SQL文件名: {sql_filename}")
|
||||
else:
|
||||
self._ps_log("代码整理完成,但未获取到SQL文件名")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_start_admin(self):
|
||||
"""启动后台前端"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("启动后台前端...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
automation.start_admin()
|
||||
if automation.wait_for_service(config.admin_url, config.admin_startup_timeout):
|
||||
self._ps_log("后台前端启动成功!")
|
||||
else:
|
||||
self._ps_log("后台前端启动超时,请手动检查")
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_replace_images(self):
|
||||
"""更换图片"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("更换图片...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
|
||||
# 更换前台轮播图片
|
||||
self._ps_log("更换前台轮播图片...")
|
||||
result = automation.replace_swiper_images()
|
||||
self._ps_log(result)
|
||||
|
||||
# 更换后台登录背景图
|
||||
self._ps_log("更换后台登录背景图...")
|
||||
if automation.update_login_vue_background():
|
||||
self._ps_log("后台登录背景图更换成功!")
|
||||
else:
|
||||
self._ps_log("后台登录背景图更换失败")
|
||||
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_capture_admin(self):
|
||||
"""后台截图"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始后台截图...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
|
||||
import asyncio
|
||||
# 截图保存到桌面路径下的"截图"文件夹
|
||||
output_dir = os.path.join(config.desktop_path, "截图")
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
screenshots = asyncio.run(automation.capture_admin_screenshots_only(output_dir))
|
||||
self._ps_log(f"后台截图完成!共生成 {len(screenshots)} 张截图,保存到: {output_dir}")
|
||||
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_capture_front(self):
|
||||
"""前台截图"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始前台截图...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
|
||||
import asyncio
|
||||
# 截图保存到桌面路径下的"截图"文件夹
|
||||
output_dir = os.path.join(config.desktop_path, "截图")
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
screenshots = asyncio.run(automation.capture_front_screenshots_only(output_dir))
|
||||
self._ps_log(f"前台截图完成!共生成 {len(screenshots)} 张截图,保存到: {output_dir}")
|
||||
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_finalize_screenshots(self):
|
||||
"""截图收尾工作"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始执行截图收尾工作...")
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
|
||||
# 截图保存到桌面路径下的"截图"文件夹
|
||||
output_dir = os.path.join(config.desktop_path, "截图")
|
||||
|
||||
automation.finalize_screenshots(output_dir)
|
||||
self._ps_log(f"截图收尾工作完成!")
|
||||
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_run_full_flow(self):
|
||||
"""一键完整流程"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
config = self._get_ps_config()
|
||||
automation = ProjectScreenshotAutomation(config, log_callback=self._ps_log)
|
||||
success = automation.run_full_flow()
|
||||
if success:
|
||||
self.root.after(0, lambda: messagebox.showinfo("成功", "完整流程执行成功!"))
|
||||
else:
|
||||
self.root.after(0, lambda: messagebox.showerror("错误", "流程执行失败,请查看日志"))
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
self.root.after(0, lambda: messagebox.showerror("错误", f"执行失败: {str(e)}"))
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
def _ps_close_all_cmd(self):
|
||||
"""关闭所有CMD窗口"""
|
||||
def run():
|
||||
try:
|
||||
self._ps_set_running(True)
|
||||
self._ps_log("=" * 50)
|
||||
self._ps_log("开始关闭所有CMD窗口...")
|
||||
config = self._get_ps_config()
|
||||
|
||||
# 构建 close_cmd.bat 路径
|
||||
close_cmd_bat = os.path.join(config.desktop_path, config.bat_folder, "close_cmd.bat")
|
||||
|
||||
if not os.path.exists(close_cmd_bat):
|
||||
self._ps_log(f"错误:close_cmd.bat 不存在: {close_cmd_bat}")
|
||||
return
|
||||
|
||||
self._ps_log(f"执行: {close_cmd_bat}")
|
||||
|
||||
# 执行 bat 文件(弹出CMD窗口)
|
||||
import subprocess
|
||||
|
||||
if config.show_cmd_window:
|
||||
# 显示CMD窗口
|
||||
startupinfo = subprocess.STARTUPINFO()
|
||||
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
||||
startupinfo.wShowWindow = 1 # SW_SHOWNORMAL
|
||||
|
||||
subprocess.Popen(
|
||||
['cmd', '/c', close_cmd_bat],
|
||||
creationflags=subprocess.CREATE_NEW_CONSOLE,
|
||||
startupinfo=startupinfo,
|
||||
cwd=config.desktop_path
|
||||
)
|
||||
self._ps_log("CMD窗口已弹出执行关闭命令")
|
||||
else:
|
||||
# 不显示CMD窗口
|
||||
result = subprocess.run(
|
||||
['cmd', '/c', close_cmd_bat],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
encoding='utf-8',
|
||||
errors='ignore'
|
||||
)
|
||||
if result.returncode == 0:
|
||||
self._ps_log("CMD窗口关闭成功!")
|
||||
if result.stdout:
|
||||
self._ps_log(result.stdout)
|
||||
else:
|
||||
self._ps_log(f"关闭失败: {result.stderr}")
|
||||
|
||||
except Exception as e:
|
||||
self._ps_log(f"错误: {str(e)}")
|
||||
finally:
|
||||
self._ps_set_running(False)
|
||||
|
||||
threading.Thread(target=run, daemon=True).start()
|
||||
|
||||
|
||||
def main():
|
||||
"""启动 GUI"""
|
||||
|
||||
Reference in New Issue
Block a user