111 lines
3.0 KiB
Python
111 lines
3.0 KiB
Python
|
|
#!/usr/bin/env python
|
|||
|
|
# -*- coding: utf-8 -*-
|
|||
|
|
"""
|
|||
|
|
示例:后台主程序如何启动 GUI
|
|||
|
|
|
|||
|
|
将此文件放在后台工程根目录,作为参考
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import subprocess
|
|||
|
|
import sys
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
|
|||
|
|
class GUIManager:
|
|||
|
|
"""GUI 进程管理器"""
|
|||
|
|
|
|||
|
|
def __init__(self, api_host='127.0.0.1', api_port=5050):
|
|||
|
|
self.api_host = api_host
|
|||
|
|
self.api_port = api_port
|
|||
|
|
self.gui_process = None
|
|||
|
|
|
|||
|
|
def start_gui(self):
|
|||
|
|
"""启动 GUI 前端"""
|
|||
|
|
gui_script = os.path.join(
|
|||
|
|
os.path.dirname(__file__),
|
|||
|
|
'frontend_gui',
|
|||
|
|
'launch_gui.py'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
if not os.path.exists(gui_script):
|
|||
|
|
print(f"错误: GUI 启动脚本不存在: {gui_script}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
print(f"启动 GUI 前端...")
|
|||
|
|
print(f" API 地址: http://{self.api_host}:{self.api_port}")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
self.gui_process = subprocess.Popen(
|
|||
|
|
[
|
|||
|
|
sys.executable,
|
|||
|
|
gui_script,
|
|||
|
|
'--api-host', self.api_host,
|
|||
|
|
'--api-port', str(self.api_port),
|
|||
|
|
'--debug'
|
|||
|
|
],
|
|||
|
|
stdout=subprocess.PIPE,
|
|||
|
|
stderr=subprocess.PIPE,
|
|||
|
|
cwd=os.path.dirname(os.path.abspath(__file__))
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
print(f"GUI 进程已启动,PID: {self.gui_process.pid}")
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"启动 GUI 失败: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def stop_gui(self):
|
|||
|
|
"""停止 GUI 进程"""
|
|||
|
|
if self.gui_process:
|
|||
|
|
print("正在关闭 GUI...")
|
|||
|
|
self.gui_process.terminate()
|
|||
|
|
try:
|
|||
|
|
self.gui_process.wait(timeout=5)
|
|||
|
|
print("GUI 已关闭")
|
|||
|
|
except subprocess.TimeoutExpired:
|
|||
|
|
print("GUI 未响应,强制关闭")
|
|||
|
|
self.gui_process.kill()
|
|||
|
|
self.gui_process.wait()
|
|||
|
|
|
|||
|
|
def is_running(self):
|
|||
|
|
"""检查 GUI 是否运行"""
|
|||
|
|
if self.gui_process:
|
|||
|
|
return self.gui_process.poll() is None
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
"""示例:在后台程序中集成 GUI 启动"""
|
|||
|
|
print("=== 后台主程序示例 ===")
|
|||
|
|
|
|||
|
|
# 1. 启动后台服务(这里省略,实际应该启动 Flask 等)
|
|||
|
|
print("1. 后台服务启动...")
|
|||
|
|
|
|||
|
|
# 2. 创建 GUI 管理器并启动 GUI
|
|||
|
|
gui_manager = GUIManager(api_host='127.0.0.1', api_port=5050)
|
|||
|
|
|
|||
|
|
if gui_manager.start_gui():
|
|||
|
|
print("2. GUI 前端已启动")
|
|||
|
|
else:
|
|||
|
|
print("2. GUI 前端启动失败")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
# 3. 等待用户操作
|
|||
|
|
try:
|
|||
|
|
print("\n系统运行中,按 Ctrl+C 退出...\n")
|
|||
|
|
while gui_manager.is_running():
|
|||
|
|
import time
|
|||
|
|
time.sleep(1)
|
|||
|
|
print("GUI 已退出")
|
|||
|
|
except KeyboardInterrupt:
|
|||
|
|
print("\n收到退出信号")
|
|||
|
|
finally:
|
|||
|
|
# 4. 清理
|
|||
|
|
gui_manager.stop_gui()
|
|||
|
|
print("后台服务关闭")
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
main()
|