用户:
_昵称副本_查看:2 回复:4 评论:2 创建时间:2024-08-20T15:20:02
窗口非线性放大
import tkinter as tk
class Win(tk.Tk):
def __init__(self):
super().__init__()
self.title("窗口")
self.geometry("1280x720")
self.update_idletasks()
max_width = 1280
max_height = 720
init_x = 840
init_y = 525
win_size = 0
while (100 - win_size) > 0.1:
win_size += (100 - win_size) / 30
width = int(max_width * (win_size / 100))
height = int(max_height * (win_size / 100))
win_x = init_x - width // 2
win_y = init_y - height // 2
self.geometry(f"{width}x{height}+{win_x}+{win_y}")
self.update()
self.after(1) # 添加延迟,模拟动画效果
self.geometry(f"{max_width}x{max_height}+{init_x - max_width // 2}+{init_y - max_height // 2}")
if __name__ == "__main__":
app = Win()
app.mainloop()以下是对您提供的 Tkinter 窗口动画代码的改进版本。主要改进包括:使用 self.after() 方法来控制动画的步骤而不是循环,确保代码更清晰可读,同时也解决了可能导致的性能问题。
import tkinter as tk
class Win(tk.Tk):
def __init__(self):
super().__init__()
self.title("窗口")
self.geometry("1280x720")
self.update_idletasks()
self.max_width = 1280
self.max_height = 720
self.init_x = 840
self.init_y = 525
self.win_size = 0
self.animation_steps = 30 # 动画的步骤数
self.step_delay = 1 # 每一步的延迟时间(毫秒)
# 开始动画
self.animate()
def animate(self):
if (100 - self.win_size) > 0.1:
# 更新窗口大小
self.win_size += (100 - self.win_size) / self.animation_steps
width = int(self.max_width * (self.win_size / 100))
height = int(self.max_height * (self.win_size / 100))
win_x = self.init_x - width // 2
win_y = self.init_y - height // 2
self.geometry(f"{width}x{height}+{win_x}+{win_y}")
self.after(self.step_delay, self.animate) # 调用下一帧动画
else:
# 动画完成,设置最终大小
self.geometry(f"{self.max_width}x{self.max_height}+{self.init_x - self.max_width // 2}+{self.init_y - self.max_height // 2}")
if __name__ == "__main__":
app = Win()
app.mainloop() 改进内容:
animate 方法中,并使用 self.after() 来进行定时调用,而不是使用 while 循环,这样可以避免阻塞主线程,保持界面响应。animation_steps 和 step_delay,方便您在需要时调整动画的流畅度和速度。
点赞0
评论