zoukankan      html  css  js  c++  java
  • python使用tkiner创建一个小球滚动的代码

    #  tkinter - 项目实战
    
    '''
    
    - 项目分析
        - 屏保可以自己启动,也可以手动启动.
        - 一旦敲击键盘或者移动鼠标,或者引发事件,则停止.
        - 如果屏保是一幅画的话,则没有画框.
        - 图像的动作是随机的,具有随机性.(包括颜色,大小,运动方向,变形)
    
        - 整个世界的构成是
            - ScreenSaver
                - 需要一个canvas. 大小等于屏幕大小,没有边框.
            - Ball
                - 包括颜色,大小,运动方向,变形 => 随机
                - 球能动, 可以被调用.
    
    '''
    
    import tkinter as tk
    import random
    
    class RandomBall:
        '''
        定义一个运动球的类
        '''
        def __init__(self,canvas,scrnWidth,scrnHeight):
    
            '''
            canvas:画布,所有的内容都应该在画布上呈现出来.此处通过此变量传入
            scrnWidth/scrnheigh:屏幕宽高
    
            '''
            self.canvas = canvas # 这个是自己添加的.添加原因是下方代码并没有 self.canvas
    
            # 球出现的初始位置要随机.此位置表示圆心
            
            # xpos表示位置的x坐标
            self.xops = random.randint(10,int(scrnWidth)-20)
    
            # ypos表示位置y的坐标
            self.yops = random.randint(10,int(scrnHeight)-20)
    
            # 定义球运动的速度 => 模拟运动: 动画的逻辑就是重绘 =>模拟运动,不断的擦掉旧事物,重新绘制新事物
            self.xvelocity = random.randint(4,20)
            self.yvelocity = random.randint(4,20)
    
            # 定义屏幕的宽度和高度
            self.scrnWidth = scrnWidth
            self.scrnHeight = scrnHeight
    
            # 球的大小随机.
            # 此处球的大小用半径表示
            self.radius = random.randint(20,80)
    
    
            # 定义颜色
            # RGB表示法:三个数字,每个数字的值是0-255之间,表示RGB
            c = lambda:random.randint(0,255)
    
            self.color = '#%02x%02x%02x'%(c(),c(),c()) # 这个地方存疑
    
    
        def  create_ball(self):#定义一个函数
            
            '''
            用构造函数定义的变量值,在canvas上画一个球
            '''
            # tkinter没有画圆形的函数
            # 只有一个画椭圆函数,画椭圆需要定义两个坐标
            # 在一个长方形内画椭圆,我们只需要定义长方形左上角和右下角就好 => 如果是一个正方形,那么椭圆就是圆
            # 求两个坐标的方法是 (圆心 - 半径)
            x1 = self.xops - self.radius
            y1 = self.yops - self.radius # 椭圆的左上角
            x2 = self.xops + self.radius
            y2 = self.yops + self.radius # 椭圆的右下角
    
            self.item = self.canvas.create_oval(x1,y1,x2,y2,fill=self.color,outline=self.color) # 绘制椭圆
    
        def move_ball(self):
            
            # 移动球的时候,控制球的方向
            # 每次移动后,球都有一个新的坐标
            self.xops += self.xvelocity
            self.yops += self.yvelocity
    
            # 以下判断是否会撞墙 => 撞墙的算法判断
    
            if self.xops +self.radius>=self.scrnWidth: #撞到右边的墙了
                self.xvelocity*=-1
            elif self.xops+self.radius<=0:
                self.xvelocity*=-1
            
            if self.yops + self.radius >=self.scrnHeight:
                self.yvelocity*=-1
            elif self.yops +self.radius <= 0:
                self.yvelocity *=-1
    
    
    
    
            # 在画布上移动动画
            self.canvas.move(self.item,self.xvelocity,self.yvelocity)
    
    
    class ScreenSaver:
        '''
        定义屏保的类
        可以被启动
        '''
        # 如何装随机产生的球
        balls = list()
    
        def __init__(self):
            
            self.num_balls = random.randint(6,20)
    
            self.root = tk.Tk()
            
            # 取消边框
            self.root.overrideredirect(1)
    
            # 任何鼠标移动都要取消
            self.root.bind('<Motion>',self.myquit)
    
            # 同理,安东任何键盘都需要退出屏保
    
            # 得到 屏幕大小规格
            w,h = self.root.winfo_screenwidth(),self.root.winfo_screenheight()
    
            self.canvas = tk.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(20, self.run_screen_saver)
    
    
        def myquit(self,e):
            # 此处只是利用了事件处理机制
            # 实际上并不关心事件的类型 
            # 作业:
            # 此屏保程序扩展成,一旦捕获事件,则判断屏保不退出
            # 显示一个Button,Button上显示事件类型,点击Button后屏保
            # 才退出
            self.root.destroy()
            
    if __name__ == "__main__":
        ScreenSaver()
    
  • 相关阅读:
    不要让生命的车轮停下,否则再次驱动需要更多的力气
    计算机英语
    知我者谓我心忧,不知我者谓我何求
    Poverty in USA and China
    [转]PCI配置空间简介
    基于OpenGL的起重机模拟
    OpenGL 彩色旋转立方体
    asp.net下载文件几种方式
    Jquery+$.cookie()实现跨越页面tabs导航
    简单自定义实现jQuery验证
  • 原文地址:https://www.cnblogs.com/gtscool/p/11703562.html
Copyright © 2011-2022 走看看