• Tkinter 项目-屏保


    参考教程,以及网上资料,针对小白更好理解

    关于tkinter的屏保涉及的知识点和思想

      项目分析:

    • 屏保启动方式:手动,自动
    • 敲击键盘或者移动鼠标后,或者其他引发事件,则停止
    • 如果屏保是一幅画的话,则没有边框
    • 图像的动作是随机的,具有随机性,可能包括颜色,大小,多少,运动方向,变形等
    • 整个世界的构成是
      • ScreenSaver:
        • 需要一个cancas,大小和屏幕一直,没有边框
      • Ball
        • 颜色,大小,多少,运动方向,变形等随机
        • 球能动,可以被调用
    import tkinter
    import random
    
    class RandomBall():
        '''
        定义运动的球的类
    
        '''
        def __init__(self, canvas, scrnwidth, scrnheight):
            self.canvas = canvas
    #     '''
    #     canvas:画布,所有的内容都应该在画布上呈现出来,此处通过此变量传入
    #     scrnwidth/scrnheight 屏幕宽高
    #     '''
        
            # 球出现的位置是随机的,此处位置表示求得圆心
            # xpos表示位置的x坐标
            self.xpos = random.randint(10, int(scrnwidth)-20)
            # ypos表示位置的y坐标
            self.ypos = random.randint(10, int(scrnheight)-20)
    
    
            # 定义球的运动速度
            # 模拟运动: 不断的擦掉原来的画,然后在一个新的地方在从新绘制
            # 此处xvelocity 模拟x轴方向运动
            self.xvelocity = random.randint(4,12)
            # 同理,yvelocity模拟是y轴方向运动
            self.yvelocity = random.randint(4,12)
    
            # 定义屏幕的大小
            self.scrnwidth = scrnwidth
            # 定义屏幕的高度
            self.scrnheight = scrnheight
    
            # 球的大小随机
            # 此处球的大小用半径表示
            self.radius = random.randint(20,120)
    
            # 定义颜色
            # RGB表示法:三个数字,每个数字的值是0-255之间,表示红绿蓝三个颜色的大小
            # 在某些系统中,之间用英文单词表示也可以,比如red ,green
            # 此处用lambda 表达式
            c = lambda : random.randint(0, 255)
            self.color = '#%02x%02x%02x'%(c(), c(), c())
        
        def create_ball(self):
            '''
            用构造函数定义的变量值,在canvas上画一个球
            '''
            #tkinter没有画圆形的函数
            # 只有一个画椭圆的函数,画椭圆需要定义两个坐标
            # 在长方形内画椭圆,我们只需要定义长方形左上角和右下角就好
            # 球两个坐标的方法是,已知圆心的坐标,则圆心坐标减去半径能求出左上角坐标
            # 圆心坐标加上半径能求出右下角坐标
            x1 = self.xpos - self.radius
            y1 = self.ypos - self.radius
            x2 = self.xpos + self.radius
            y2 = self.ypos + self.radius
            
            # 再有两个对象坐标前提下,可以进行画圆
            # fill表示填充颜色
            # outline  表示外围边框颜色
            self.item = self.canvas.create_oval(x1, y1, x2, y2, 
                                               fill = self.color, 
                                               outline = self.color)
        def move_ball(self):
            # 移动球的时候需要控制球的方法
            # 每次移动后,球都有一个新的坐标
            self.xpos += self.xvelocity
            self.ypos += self.yvelocity
            # 或者 self.xpos *= -1
            
            # 然后判断是否撞墙
            # 撞了墙就得回头
            # 撞墙后的算法判断
            if self.xpos + self.radius >= self.scrnwidth or 
            self.xpos - self.radius <= 0:
                self.xvelocity = -self.xvelocity
            if self.ypos + self.radius >= self.scrnheight or 
            self.ypos - self.radius <= 0:
                self.yvelocity = -self.yvelocity
                
            #在画布上挪动图画
            self.canvas.move(self.item, self.xvelocity, self.yvelocity)
        
        
        
    
    class ScreenSaver():
        '''
        定义屏保的类
        可以被启动
        '''
        # 定义装随机产生的球?
        
        
        def __init__(self):
            self.balls = []
            # 每次启动球的数量随机
            self.num_balls = random.randint(6, 20)
            
            self.root = tkinter.Tk()
            # 取消边框
            self.root.overrideredirect(1)
            # 制作透明窗口
            self.root.attributes('-alpha', 0.3)
            
            # 任何鼠标移动都需要俏销
            self.root.bind('<Motion>', self.myquit)
            # 按动任何键盘都需要退出屏保
            self.root.bind('<Key>', self.myquit)
            # 得到屏幕大小规格
            w,h = self.root.winfo_screenwidth(), self.root.winfo_screenheight()
            
            # 创建画布,包括画布的归属,规格
            self.canvas = tkinter.Canvas(self.root, width=w, height=h)
            self.canvas.pack()
            
            # 在画布上画球
            for i in range(self.num_balls):
                ball = RandomBall(self.canvas, scrnwidth=w, scrnheight=h)
                ball.create_ball()
                self.balls.append(ball)
                
            self.run_screen_saver()
            self.root.mainloop()
            
        def run_screen_saver(self):
            for ball in self.balls:
                ball.move_ball()
                
                #after是200毫秒后启动一个函数,需要启动的函数是第二个参数
            self.canvas.after(50,self.run_screen_saver)
        
        def myquit(self, e):
            # 此处只是利用了时间的处理机制
            # 实际上并不关心时间的类型
            self.root.destroy()
                
                
                
    if __name__=="__main__":
        ScreenSaver()
    想学就不晚
  • 相关阅读:
    简单理解OOP——面向对象编程
    SpringMVC拦截器
    Vue简洁及基本用法
    springMVC实现文件上传下载
    Python笔记⑤爬虫
    Python笔记4
    Python笔记3
    Python基础语法笔记2
    Python基础入门语法1
    Navicat连接mysql时候出现1251错误代码
  • 原文地址:https://www.cnblogs.com/pythonzwd/p/10056694.html
Copyright © 2020-2023  润新知