猫史档案馆


python非线性窗口

用户:_昵称副本__昵称副本_查看: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()


回复

上一页1 页 / 共 1下一页
卡塔欧尼酱卡塔欧尼酱

逆天,试试

点赞0


评论


卡塔欧尼酱卡塔欧尼酱

感觉不大好用,有点卡顿

点赞0


评论


桑雨硕Micky桑雨硕Micky

点赞1


评论


code猫的code猫的

以下是对您提供的 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()
改进内容:
  1. 动画逻辑:将动画逻辑移入 animate 方法中,并使用 self.after() 来进行定时调用,而不是使用 while 循环,这样可以避免阻塞主线程,保持界面响应。
  2. 参数化:添加了一些参数如 animation_steps 和 step_delay,方便您在需要时调整动画的流畅度和速度。
  3. 代码可读性:通过方法分离和更清晰的命名,使代码更易于理解和维护。

 

点赞0


评论