221 lines
6.9 KiB
Python
221 lines
6.9 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
启动和关闭提示窗口
|
||
使用 tkinter 实现轻量级的提示界面
|
||
"""
|
||
|
||
import tkinter as tk
|
||
from tkinter import ttk
|
||
import threading
|
||
import time
|
||
|
||
|
||
class SplashWindow:
|
||
"""启动提示窗口"""
|
||
|
||
def __init__(self, title="正在启动", message="系统正在加载,请稍候..."):
|
||
self.window = None
|
||
self.title = title
|
||
self.message = message
|
||
self._closed = False
|
||
|
||
def show(self):
|
||
"""显示启动窗口(在单独线程中)"""
|
||
self._window_ready = threading.Event()
|
||
|
||
def _create_window():
|
||
self.window = tk.Tk()
|
||
self.window.title(self.title)
|
||
|
||
# 窗口大小和位置
|
||
width = 400
|
||
height = 150
|
||
screen_width = self.window.winfo_screenwidth()
|
||
screen_height = self.window.winfo_screenheight()
|
||
x = (screen_width - width) // 2
|
||
y = (screen_height - height) // 2
|
||
self.window.geometry(f"{width}x{height}+{x}+{y}")
|
||
|
||
# 无边框、置顶
|
||
self.window.overrideredirect(True)
|
||
self.window.attributes('-topmost', True)
|
||
|
||
# 背景色
|
||
self.window.configure(bg='#f0f0f0')
|
||
|
||
# 创建主框架
|
||
main_frame = tk.Frame(self.window, bg='#f0f0f0', padx=20, pady=20)
|
||
main_frame.pack(fill=tk.BOTH, expand=True)
|
||
|
||
# 标题
|
||
title_label = tk.Label(
|
||
main_frame,
|
||
text="跌落试验管理系统",
|
||
font=('Microsoft YaHei', 16, 'bold'),
|
||
bg='#f0f0f0',
|
||
fg='#333333'
|
||
)
|
||
title_label.pack(pady=(0, 10))
|
||
|
||
# 提示信息
|
||
message_label = tk.Label(
|
||
main_frame,
|
||
text=self.message,
|
||
font=('Microsoft YaHei', 11),
|
||
bg='#f0f0f0',
|
||
fg='#666666'
|
||
)
|
||
message_label.pack(pady=(0, 15))
|
||
|
||
# 进度条
|
||
self.progress = ttk.Progressbar(
|
||
main_frame,
|
||
mode='indeterminate',
|
||
length=350
|
||
)
|
||
self.progress.pack()
|
||
self.progress.start(10) # 开始动画
|
||
|
||
# 边框
|
||
border_frame = tk.Frame(self.window, bg='#3A84FF', bd=0)
|
||
border_frame.place(x=0, y=0, relwidth=1, height=3)
|
||
|
||
# 强制刷新显示
|
||
self.window.update_idletasks()
|
||
self.window.update()
|
||
|
||
# 标记窗口已准备好
|
||
self._window_ready.set()
|
||
|
||
# 运行主循环
|
||
self.window.mainloop()
|
||
|
||
# 在单独线程中创建窗口
|
||
self.thread = threading.Thread(target=_create_window, daemon=True)
|
||
self.thread.start()
|
||
|
||
# 等待窗口创建完成(最多等待2秒)
|
||
self._window_ready.wait(timeout=2.0)
|
||
|
||
def close(self):
|
||
"""关闭启动窗口"""
|
||
if self.window and not self._closed:
|
||
try:
|
||
self._closed = True
|
||
# 在 tkinter 线程中关闭窗口
|
||
if self.window:
|
||
self.window.after(0, self._safe_close)
|
||
# 等待线程结束(最多0.5秒)
|
||
if self.thread and self.thread.is_alive():
|
||
self.thread.join(timeout=0.5)
|
||
except Exception as e:
|
||
print(f"关闭启动窗口时出错: {e}")
|
||
|
||
def _safe_close(self):
|
||
"""安全关闭窗口(在 tkinter 线程中执行)"""
|
||
try:
|
||
if self.window:
|
||
self.window.quit()
|
||
self.window.destroy()
|
||
except Exception as e:
|
||
print(f"关闭窗口时出错: {e}")
|
||
|
||
|
||
class ClosingWindow:
|
||
"""关闭提示窗口"""
|
||
|
||
def __init__(self, title="正在关闭", message="系统正在关闭,请稍候..."):
|
||
self.window = None
|
||
self.title = title
|
||
self.message = message
|
||
self._closed = False
|
||
|
||
def show(self):
|
||
"""显示关闭窗口(在主线程中)"""
|
||
self.window = tk.Tk()
|
||
self.window.title(self.title)
|
||
|
||
# 窗口大小和位置
|
||
width = 400
|
||
height = 150
|
||
screen_width = self.window.winfo_screenwidth()
|
||
screen_height = self.window.winfo_screenheight()
|
||
x = (screen_width - width) // 2
|
||
y = (screen_height - height) // 2
|
||
self.window.geometry(f"{width}x{height}+{x}+{y}")
|
||
|
||
# 无边框、置顶
|
||
self.window.overrideredirect(True)
|
||
self.window.attributes('-topmost', True)
|
||
|
||
# 背景色
|
||
self.window.configure(bg='#f0f0f0')
|
||
|
||
# 创建主框架
|
||
main_frame = tk.Frame(self.window, bg='#f0f0f0', padx=20, pady=20)
|
||
main_frame.pack(fill=tk.BOTH, expand=True)
|
||
|
||
# 标题
|
||
title_label = tk.Label(
|
||
main_frame,
|
||
text="跌落试验管理系统",
|
||
font=('Microsoft YaHei', 16, 'bold'),
|
||
bg='#f0f0f0',
|
||
fg='#333333'
|
||
)
|
||
title_label.pack(pady=(0, 10))
|
||
|
||
# 提示信息
|
||
message_label = tk.Label(
|
||
main_frame,
|
||
text=self.message,
|
||
font=('Microsoft YaHei', 11),
|
||
bg='#f0f0f0',
|
||
fg='#666666'
|
||
)
|
||
message_label.pack(pady=(0, 15))
|
||
|
||
# 进度条
|
||
"""
|
||
self.progress = ttk.Progressbar(
|
||
main_frame,
|
||
mode='indeterminate',
|
||
length=350
|
||
)
|
||
self.progress.pack()
|
||
self.progress.start(10) # 开始动画
|
||
"""
|
||
# 边框
|
||
border_frame = tk.Frame(self.window, bg='#ff6b6b', bd=0)
|
||
border_frame.place(x=0, y=0, relwidth=1, height=3)
|
||
|
||
# 刷新窗口
|
||
self.window.update()
|
||
|
||
def close(self):
|
||
"""关闭窗口"""
|
||
if self.window and not self._closed:
|
||
try:
|
||
self._closed = True
|
||
self.window.quit()
|
||
self.window.destroy()
|
||
except Exception as e:
|
||
print(f"关闭提示窗口时出错: {e}")
|
||
|
||
def update_message(self, message):
|
||
"""更新提示信息"""
|
||
if self.window:
|
||
try:
|
||
# 查找message_label并更新
|
||
for widget in self.window.winfo_children():
|
||
if isinstance(widget, tk.Frame):
|
||
for child in widget.winfo_children():
|
||
if isinstance(child, tk.Label) and child.cget('font')[1] == 11:
|
||
child.config(text=message)
|
||
break
|
||
self.window.update()
|
||
except Exception as e:
|
||
print(f"更新提示信息时出错: {e}")
|