|
|
在 Tkinter 中实现两个窗口切换时的进度条转场动画,可以按照以下思路进行:
1. 创建一个独立的进度条窗口作为过渡界面
2. 在关闭当前窗口时显示进度条窗口
3. 进度条完成后打开目标窗口
以下是示例代码:
- import tkinter as tk
- from tkinter import ttk
- import time
- class MainApp:
- def __init__(self):
- self.root = tk.Tk()
- self.root.title("主窗口")
-
- # 窗口1的内容
- self.frame1 = tk.Frame(self.root, width=400, height=300)
- self.frame1.pack()
-
- tk.Label(self.frame1, text="这是窗口1", font=("Arial", 20)).pack(pady=50)
- tk.Button(self.frame1, text="切换到窗口2",
- command=self.switch_to_window2).pack()
-
- def switch_to_window2(self):
- # 创建过渡窗口
- self.show_transition_window()
-
- # 短暂延迟后关闭当前窗口
- self.root.after(100, self.open_window2)
-
- def show_transition_window(self):
- # 创建过渡窗口
- self.transition = tk.Toplevel()
- self.transition.title("加载中...")
- self.transition.geometry("300x150")
-
- # 使过渡窗口模态化
- self.transition.grab_set()
-
- # 添加进度条
- self.progress = ttk.Progressbar(
- self.transition,
- mode='indeterminate',
- length=200
- )
- self.progress.pack(pady=40)
-
- # 添加标签
- tk.Label(self.transition, text="正在切换窗口...").pack()
-
- # 开始进度条动画
- self.progress.start(10)
-
- def open_window2(self):
- # 关闭窗口1
- self.root.withdraw()
-
- # 创建窗口2
- self.window2 = tk.Toplevel()
- self.window2.title("窗口2")
- self.window2.geometry("400x300")
-
- # 窗口2的内容
- tk.Label(self.window2, text="这是窗口2", font=("Arial", 20)).pack(pady=50)
- tk.Button(self.window2, text="返回窗口1",
- command=self.back_to_window1).pack()
-
- # 关闭过渡窗口
- self.transition.destroy()
-
- # 绑定窗口关闭事件
- self.window2.protocol("WM_DELETE_WINDOW", self.on_closing)
-
- def back_to_window1(self):
- # 显示过渡窗口
- self.show_transition_window()
-
- # 短暂延迟后切换回窗口1
- self.window2.after(100, self.return_to_window1)
-
- def return_to_window1(self):
- # 关闭窗口2
- self.window2.destroy()
-
- # 重新显示窗口1
- self.root.deiconify()
-
- # 关闭过渡窗口
- self.transition.destroy()
-
- def on_closing(self):
- # 关闭所有窗口并退出程序
- self.root.destroy()
-
- def run(self):
- self.root.mainloop()
- if __name__ == "__main__":
- app = MainApp()
- app.run()
复制代码
如果想要使用确定模式的进度条(显示具体进度),可以修改为以下版本:
- import tkinter as tk
- from tkinter import ttk
- import threading
- class ProgressTransition:
- def __init__(self, callback):
- self.callback = callback
-
- # 创建过渡窗口
- self.window = tk.Toplevel()
- self.window.title("加载中...")
- self.window.geometry("300x150")
-
- # 使窗口居中
- self.window.update_idletasks()
- width = self.window.winfo_width()
- height = self.window.winfo_height()
- x = (self.window.winfo_screenwidth() // 2) - (width // 2)
- y = (self.window.winfo_screenheight() // 2) - (height // 2)
- self.window.geometry(f'{width}x{height}+{x}+{y}')
-
- # 添加进度条
- self.progress = ttk.Progressbar(
- self.window,
- mode='determinate',
- length=250
- )
- self.progress.pack(pady=30)
-
- # 添加标签
- self.label = tk.Label(self.window, text="正在切换... 0%")
- self.label.pack()
-
- # 开始进度更新线程
- self.thread = threading.Thread(target=self.update_progress)
- self.thread.daemon = True
- self.thread.start()
-
- def update_progress(self):
- for i in range(101):
- time.sleep(0.02) # 控制速度
-
- # 使用after方法在主线程中更新UI
- self.window.after(0, self.update_ui, i)
-
- # 完成后执行回调
- self.window.after(0, self.complete)
-
- def update_ui(self, value):
- self.progress['value'] = value
- self.label.config(text=f"正在切换... {value}%")
-
- def complete(self):
- self.window.destroy()
- self.callback()
- # 使用示例
- class TwoWindowApp:
- def __init__(self):
- self.root = tk.Tk()
- self.root.title("双窗口应用")
-
- self.create_window1()
-
- def create_window1(self):
- self.window1 = tk.Frame(self.root, width=400, height=300)
- self.window1.pack()
-
- tk.Label(self.window1, text="窗口1", font=("Arial", 24)).pack(pady=50)
- tk.Button(self.window1, text="切换到窗口2",
- command=self.go_to_window2, width=15, height=2).pack()
-
- def go_to_window2(self):
- # 显示过渡窗口
- self.transition = ProgressTransition(self.show_window2)
-
- def show_window2(self):
- # 清除窗口1
- self.window1.pack_forget()
-
- # 创建窗口2
- self.window2 = tk.Frame(self.root, width=400, height=300)
- self.window2.pack()
-
- tk.Label(self.window2, text="窗口2", font=("Arial", 24)).pack(pady=50)
- tk.Button(self.window2, text="返回窗口1",
- command=self.return_to_window1, width=15, height=2).pack()
-
- def return_to_window1(self):
- # 显示过渡窗口
- self.transition = ProgressTransition(self.show_window1)
-
- def show_window1(self):
- # 清除窗口2
- self.window2.pack_forget()
-
- # 重新显示窗口1
- self.window1.pack()
-
- def run(self):
- self.root.mainloop()
- if __name__ == "__main__":
- app = TwoWindowApp()
- app.run()
复制代码
主要思路说明:
1. 使用 Toplevel() 创建独立的过渡窗口
2. 使用 ttk.Progressbar 创建进度条组件
3. 有两种进度条模式可选:
- indeterminate:不确定模式,循环动画
- determinate:确定模式,显示具体进度
4. 使用多线程或 after() 方法更新进度
5. 进度完成后自动关闭过渡窗口并打开目标窗口
提示:可以根据需要自定义过渡窗口的样式、动画速度和完成后的回调操作。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|