fix: 移除崩溃弹窗机制
This commit is contained in:
@@ -713,7 +713,7 @@ class GeneralSubConfig(LQConfig):
|
|||||||
|
|
||||||
class AppConfig(GlobalConfig):
|
class AppConfig(GlobalConfig):
|
||||||
|
|
||||||
VERSION = "4.4.1.2"
|
VERSION = "4.4.1.3"
|
||||||
|
|
||||||
stage_refreshed = Signal()
|
stage_refreshed = Signal()
|
||||||
PASSWORD_refreshed = Signal()
|
PASSWORD_refreshed = Signal()
|
||||||
|
|||||||
267
main.py
267
main.py
@@ -25,50 +25,6 @@ v4.4
|
|||||||
作者:DLmaster_361
|
作者:DLmaster_361
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
# Nuitka环境检测和修复
|
|
||||||
def setup_nuitka_compatibility():
|
|
||||||
"""设置Nuitka打包环境的兼容性"""
|
|
||||||
|
|
||||||
# 检测打包环境
|
|
||||||
is_nuitka = (
|
|
||||||
hasattr(sys, "frozen")
|
|
||||||
or "nuitka" in sys.modules
|
|
||||||
or "Temp\\AUTO_MAA" in str(sys.executable)
|
|
||||||
or os.path.basename(sys.executable) == "AUTO_MAA.exe"
|
|
||||||
)
|
|
||||||
|
|
||||||
if is_nuitka:
|
|
||||||
|
|
||||||
# 修复PySide6 QTimer问题
|
|
||||||
try:
|
|
||||||
from PySide6.QtCore import QTimer
|
|
||||||
|
|
||||||
original_singleShot = QTimer.singleShot
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def safe_singleShot(*args, **kwargs):
|
|
||||||
if len(args) >= 2:
|
|
||||||
msec = args[0]
|
|
||||||
callback = args[-1]
|
|
||||||
# 确保使用正确的调用签名
|
|
||||||
return original_singleShot(msec, callback)
|
|
||||||
return original_singleShot(*args, **kwargs)
|
|
||||||
|
|
||||||
QTimer.singleShot = safe_singleShot
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# 立即应用兼容性修复
|
|
||||||
setup_nuitka_compatibility()
|
|
||||||
|
|
||||||
# 屏蔽广告
|
# 屏蔽广告
|
||||||
import builtins
|
import builtins
|
||||||
|
|
||||||
@@ -88,11 +44,14 @@ def no_print(*args, **kwargs):
|
|||||||
builtins.print = no_print
|
builtins.print = no_print
|
||||||
|
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
import ctypes
|
import ctypes
|
||||||
import traceback
|
|
||||||
from PySide6.QtWidgets import QApplication
|
from PySide6.QtWidgets import QApplication
|
||||||
from qfluentwidgets import FluentTranslator
|
from qfluentwidgets import FluentTranslator
|
||||||
|
|
||||||
|
from app.core.logger import logger
|
||||||
|
|
||||||
|
|
||||||
def is_admin() -> bool:
|
def is_admin() -> bool:
|
||||||
"""检查当前程序是否以管理员身份运行"""
|
"""检查当前程序是否以管理员身份运行"""
|
||||||
@@ -102,214 +61,28 @@ def is_admin() -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def show_system_error(title: str, message: str, detailed_error: str = None):
|
@logger.catch
|
||||||
"""使用系统级消息框显示错误"""
|
|
||||||
try:
|
|
||||||
# Windows系统消息框
|
|
||||||
if sys.platform == "win32":
|
|
||||||
# 组合完整的错误信息
|
|
||||||
full_message = message
|
|
||||||
if detailed_error:
|
|
||||||
# 限制详细错误信息长度,避免消息框过大
|
|
||||||
if len(detailed_error) > 2000:
|
|
||||||
detailed_error = (
|
|
||||||
detailed_error[:2000] + "\n\n... (错误信息过长已截断)"
|
|
||||||
)
|
|
||||||
full_message += f"\n\n详细错误信息:\n{detailed_error}"
|
|
||||||
|
|
||||||
# 使用ctypes调用Windows API
|
|
||||||
ctypes.windll.user32.MessageBoxW(
|
|
||||||
0, # 父窗口句柄
|
|
||||||
full_message, # 消息内容
|
|
||||||
title, # 标题
|
|
||||||
0x10 | 0x0, # MB_ICONERROR | MB_OK
|
|
||||||
)
|
|
||||||
|
|
||||||
# Linux系统 - 尝试使用zenity或kdialog
|
|
||||||
elif sys.platform.startswith("linux"):
|
|
||||||
full_message = message
|
|
||||||
if detailed_error:
|
|
||||||
full_message += f"\n\n详细错误:\n{detailed_error[:1000]}"
|
|
||||||
|
|
||||||
try:
|
|
||||||
# 尝试zenity (GNOME)
|
|
||||||
os.system(
|
|
||||||
f'zenity --error --title="{title}" --text="{full_message}" 2>/dev/null'
|
|
||||||
)
|
|
||||||
except:
|
|
||||||
try:
|
|
||||||
# 尝试kdialog (KDE)
|
|
||||||
os.system(
|
|
||||||
f'kdialog --error "{full_message}" --title "{title}" 2>/dev/null'
|
|
||||||
)
|
|
||||||
except:
|
|
||||||
# 降级到控制台输出
|
|
||||||
print(f"错误: {title}")
|
|
||||||
print(f"消息: {message}")
|
|
||||||
if detailed_error:
|
|
||||||
print(f"详细信息:\n{detailed_error}")
|
|
||||||
|
|
||||||
# macOS系统
|
|
||||||
elif sys.platform == "darwin":
|
|
||||||
full_message = message
|
|
||||||
if detailed_error:
|
|
||||||
full_message += f"\n\n详细错误:\n{detailed_error[:1000]}"
|
|
||||||
|
|
||||||
try:
|
|
||||||
os.system(
|
|
||||||
f'osascript -e \'display alert "{title}" message "{full_message}" as critical\''
|
|
||||||
)
|
|
||||||
except:
|
|
||||||
print(f"错误: {title}")
|
|
||||||
print(f"消息: {message}")
|
|
||||||
if detailed_error:
|
|
||||||
print(f"详细信息:\n{detailed_error}")
|
|
||||||
|
|
||||||
else:
|
|
||||||
# 其他系统降级到控制台输出
|
|
||||||
print(f"错误: {title}")
|
|
||||||
print(f"消息: {message}")
|
|
||||||
if detailed_error:
|
|
||||||
print(f"详细信息:\n{detailed_error}")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
# 如果连系统消息框都失败了,输出到控制台
|
|
||||||
print(f"无法显示错误对话框: {e}")
|
|
||||||
print(f"原始错误: {title} - {message}")
|
|
||||||
if detailed_error:
|
|
||||||
print(f"详细错误信息:\n{detailed_error}")
|
|
||||||
|
|
||||||
|
|
||||||
def save_error_log(error_info: str):
|
|
||||||
"""保存错误日志到文件"""
|
|
||||||
try:
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
|
|
||||||
log_dir = os.path.join(os.path.dirname(__file__), "debug")
|
|
||||||
os.makedirs(log_dir, exist_ok=True)
|
|
||||||
|
|
||||||
log_file = os.path.join(log_dir, f"crash_{timestamp}.log")
|
|
||||||
with open(log_file, "w", encoding="utf-8") as f:
|
|
||||||
f.write(f"AUTO_MAA 崩溃日志\n")
|
|
||||||
f.write(f"时间: {datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
|
|
||||||
f.write(f"Python版本: {sys.version}\n")
|
|
||||||
f.write(f"平台: {sys.platform}\n")
|
|
||||||
f.write(f"工作目录: {os.getcwd()}\n")
|
|
||||||
f.write("=" * 50 + "\n")
|
|
||||||
f.write(error_info)
|
|
||||||
|
|
||||||
return log_file
|
|
||||||
except:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
"""主程序入口"""
|
|
||||||
application = None
|
|
||||||
|
|
||||||
try:
|
application = QApplication(sys.argv)
|
||||||
# 创建QApplication
|
|
||||||
application = QApplication(sys.argv)
|
|
||||||
|
|
||||||
# 安装翻译器
|
translator = FluentTranslator()
|
||||||
translator = FluentTranslator()
|
application.installTranslator(translator)
|
||||||
application.installTranslator(translator)
|
|
||||||
|
|
||||||
try:
|
from app.ui.main_window import AUTO_MAA
|
||||||
# 导入主窗口模块
|
|
||||||
from app.ui.main_window import AUTO_MAA
|
|
||||||
|
|
||||||
# 创建主窗口
|
window = AUTO_MAA()
|
||||||
window = AUTO_MAA()
|
window.show_ui("显示主窗口", if_start=True)
|
||||||
window.show_ui("显示主窗口", if_start=True)
|
window.start_up_task()
|
||||||
window.start_up_task()
|
sys.exit(application.exec())
|
||||||
|
|
||||||
except ImportError as e:
|
|
||||||
error_msg = f"模块导入失败: {str(e)}"
|
|
||||||
detailed_error = traceback.format_exc()
|
|
||||||
log_file = save_error_log(f"{error_msg}\n\n{detailed_error}")
|
|
||||||
|
|
||||||
if log_file:
|
|
||||||
error_msg += f"\n\n错误日志已保存到: {log_file}"
|
|
||||||
|
|
||||||
show_system_error("模块导入错误", error_msg, detailed_error)
|
|
||||||
return
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
error_msg = f"主窗口创建失败: {str(e)}"
|
|
||||||
detailed_error = traceback.format_exc()
|
|
||||||
log_file = save_error_log(f"{error_msg}\n\n{detailed_error}")
|
|
||||||
|
|
||||||
if log_file:
|
|
||||||
error_msg += f"\n\n错误日志已保存到: {log_file}"
|
|
||||||
|
|
||||||
show_system_error("窗口创建错误", error_msg, detailed_error)
|
|
||||||
return
|
|
||||||
|
|
||||||
# 启动事件循环
|
|
||||||
sys.exit(application.exec())
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
error_msg = f"应用程序启动失败: {str(e)}"
|
|
||||||
detailed_error = traceback.format_exc()
|
|
||||||
log_file = save_error_log(f"{error_msg}\n\n{detailed_error}")
|
|
||||||
|
|
||||||
if log_file:
|
|
||||||
error_msg += f"\n\n错误日志已保存到: {log_file}"
|
|
||||||
|
|
||||||
# 尝试显示错误对话框
|
|
||||||
show_system_error("应用程序启动错误", error_msg, detailed_error)
|
|
||||||
|
|
||||||
# 如果有应用程序实例,确保正确退出
|
|
||||||
if application:
|
|
||||||
try:
|
|
||||||
application.quit()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
def handle_exception(exc_type, exc_value, exc_traceback):
|
|
||||||
"""全局异常处理器"""
|
|
||||||
if issubclass(exc_type, KeyboardInterrupt):
|
|
||||||
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
|
||||||
return
|
|
||||||
|
|
||||||
error_msg = f"未处理的异常: {exc_type.__name__}: {str(exc_value)}"
|
|
||||||
detailed_error = "".join(
|
|
||||||
traceback.format_exception(exc_type, exc_value, exc_traceback)
|
|
||||||
)
|
|
||||||
log_file = save_error_log(f"{error_msg}\n\n{detailed_error}")
|
|
||||||
|
|
||||||
if log_file:
|
|
||||||
error_msg += f"\n\n错误日志已保存到: {log_file}"
|
|
||||||
|
|
||||||
show_system_error("程序异常", error_msg, detailed_error)
|
|
||||||
|
|
||||||
|
|
||||||
# 设置全局异常处理器
|
|
||||||
sys.excepthook = handle_exception
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
||||||
try:
|
if is_admin():
|
||||||
if is_admin():
|
main()
|
||||||
main()
|
else:
|
||||||
else:
|
ctypes.windll.shell32.ShellExecuteW(
|
||||||
ctypes.windll.shell32.ShellExecuteW(
|
None, "runas", sys.executable, os.path.realpath(sys.argv[0]), None, 1
|
||||||
None, "runas", sys.executable, os.path.realpath(sys.argv[0]), None, 1
|
)
|
||||||
)
|
sys.exit(0)
|
||||||
sys.exit(0)
|
|
||||||
except Exception as e:
|
|
||||||
error_msg = f"程序启动失败: {str(e)}"
|
|
||||||
detailed_error = traceback.format_exc()
|
|
||||||
log_file = save_error_log(f"{error_msg}\n\n{detailed_error}")
|
|
||||||
|
|
||||||
if log_file:
|
|
||||||
error_msg += f"\n\n错误日志已保存到: {log_file}"
|
|
||||||
|
|
||||||
show_system_error("启动错误", error_msg, detailed_error)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
{
|
{
|
||||||
"main_version": "4.4.1.2",
|
"main_version": "4.4.1.3",
|
||||||
"version_info": {
|
"version_info": {
|
||||||
|
"4.4.1.3": {
|
||||||
|
"修复BUG": [
|
||||||
|
"移除崩溃弹窗机制"
|
||||||
|
]
|
||||||
|
},
|
||||||
"4.4.1.2": {
|
"4.4.1.2": {
|
||||||
"新增功能": [
|
"新增功能": [
|
||||||
"AUTO_MAA 配置分享中心上线"
|
"AUTO_MAA 配置分享中心上线"
|
||||||
|
|||||||
Reference in New Issue
Block a user