### 项目分析

-  屏保可以自己启动,也可以手动启动

-  一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止

-  如果屏保是一幅画的话,则没有画框

-  图像的动作是随机的,具有随机性,可能包括颜色,大小,运动方向,变形等

-  整个世界的构成是:

  -  ScreenSaver:

    - 需要一个canvas,大小与屏幕一致,没有边框

 

  -  Ball

    - 颜色,大小,多少, 运动方向,变形等随机

    - 球能动,可以被调用

----------------------------------------------------

import random
import tkinter
#pythoncom.CoInitialize()
# 定义关于球的类
class RandomBall():
    # 自动初始化画布和屏幕尺寸
    def __init__(self, canvas, scrnwidth, scrnheight):
        self.canvas = canvas
        # 定义球的初始位置(x,y),此坐标为球的圆心,位置随机生成
        self.xpos = random.randint(60, int(scrnwidth) - 60)
        self.ypos = random.randint(60, int(scrnheight) - 60)
        # 定义球在x、y方向上的移动速度,速度随机给定
        self.xvelocity = random.randint(6, 12)
        self.yvelocity = random.randint(6, 12)
        # 将屏幕尺寸的形参赋给函数内部
        self.scrnwidth = scrnwidth
        self.scrnheight = scrnheight
        # 定义球的半径,半径大小随机给定
        self.radius = random.randint(40, 70)
        #定义球的颜色
        c = lambda:random.randint(0, 255)
        self.color = '#%02x%02x%02x' % (c(), c(), c())
    # 创建球的函数
    def creat_ball(self):
        # 通过圆心,获取一矩形左上角和右下角的坐标
        x1 = self.xpos - self.radius
        y1 = self.ypos - self.radius
        x2 = self.xpos + self.radius
        y2 = self.ypos + self.radius
        # tkinter没有创建圆的函数,通过创建椭圆的方式来生成圆
        self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color,outline=self.color)
    # 创建球移动的函数
    def move_ball(self):
        # 球的(x,y)坐标根据速度变化不断更新
        self.xpos += self.xvelocity
        self.ypos += self.yvelocity
        # 当球撞到屏幕边界后,反弹的算法判断
        if self.xpos + self.radius >= self.scrnwidth:
            self.xvelocity = -self.xvelocity
        if self.xpos - self.radius <= 0:
            self.xvelocity = -self.xvelocity
        if self.ypos + self.radius >= self.scrnheight:
            self.yvelocity = -self.yvelocity
        if 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)
        # 生成root主窗口
        self.root = tkinter.Tk()
        #获取屏幕尺寸,作为主窗口尺寸
        self.width = self.root.winfo_screenwidth()
        self.height = self.root.winfo_screenheight()
        # 取消边框
        self.root.overrideredirect(1)
        # 调整背景透明度
        self.root.attributes('-alpha', 1)
        # 点击鼠标、移动鼠标、敲击键盘时退出程序
        self.root.bind('<Motion>', self.myquit)
        self.root.bind('<Any-Button>',self.myquit)
        self.root.bind('<Key>', self.myquit)
        # 创建画布,包括画布的归属、尺寸和背景颜色
        self.canvas = tkinter.Canvas(self.root,width=self.width,height=self.height,bg = "black")
        self.canvas.pack()
        # 根据num_balls随机生成的数值,在画布上生成球
        for i in range(self.num_balls):
            # 调用RandomBall函数,自动初始化出不同大小、位置和颜色的球
            ball = RandomBall(self.canvas,scrnwidth=self.width, scrnheight=self.height)
            # 调用生成球的函数
            ball.creat_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, event):
        self.root.destroy()
# 调用函数
if __name__ == '__main__':
    ScreenSaver()
# 球在边框上蹦跶主要是出生点太靠线球就不会反弹了
# 解决的方法是将出生点设置的高点 设置以下位置
# 定义球的初始位置(x,y),此坐标为球的圆心,位置随机生成
        #self.xpos = random.randint(60, int(scrnwidth) - 60)
        #self.ypos = random.randint(60, int(scrnheight) - 60)

Python---TKinter项目实战---屏保的更多相关文章

  1. appium+python自动化项目实战(一):引入nose和allure框架

    本文将介绍一套比较完整的appium自动化框架,以python为编写脚本语言,是因为python有强大的库,同时易学易懂. 最终的测试框架代码,将在jenkins项目中一键构建,执行自动化测试用例,并 ...

  2. 学霸笔记系列 - Python Selenium项目实战(一)—— 怎么去验证一个按钮是启用的(可点击)?

    Q: 使用 Python Selenium WebDriver 怎么去验证一个按钮是启用的(可点击)? A:Selenium WebDriver API 里面给出了解决方法is_enabled() 使 ...

  3. 【计算机视觉】OpenCV篇(4) - Pycharm+PyQt5+Python小项目实战

    1.下载安装 (1)Pycharm:下载链接 (2)推荐使用Qt Designer来设计界面,如果你装的是Anaconda的话,就已经自带了designer.exe,我这里使用的是Pycharm的虚拟 ...

  4. appium+python自动化项目实战(二):项目工程结构

    废话不多说,直接上图: nose.cfg配置文件里,可以指定执行的测试用例.生成测试报告等.以后将详细介绍.

  5. Tkinter 项目-屏保

    参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...

  6. 洗礼灵魂,修炼python(73)--全栈项目实战篇(1)——【转载】前提准备之学习ubuntu

    本篇是为项目实战做准备,学习Linux是必备的,不然都不好意思叫全栈对吧?下面是一位资深大神写的文章,够详细,我也不用浪费时间再写了 原文链接:Ubuntu学习——第一篇 内容: 一. Ubuntu简 ...

  7. Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验

    (一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...

  8. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  9. python写的屏保程序

    __author__ = 'ChenYan' from random import randint from tkinter import * class Randball(): def __init ...

随机推荐

  1. Jmeter之循环控制器

    在使用Jmeter测试时,部分接口需要循环执行多次,这时候就可以使用循环控制器去控制执行. 循环控制器如下图: 说明 : (1.名称:标识,建议明确此循环控制器的使用的作用是什么(如:登录循环控制) ...

  2. Selenium学习之==>18种定位方式的使用

    Selenium的定位方式一共有18种,单数8种,复数8种,最后两种是前面这16种的底层封装 单数形式8种 # 1.id定位 al = driver.find_element_by_id('i1') ...

  3. Text Elements(文本元素)对象

    1.T-Code:SE32 操作路径:主菜单——转到——内文元素——选择内文 2. 清单标题(List heading) 用于定义Report标题名称及描述,如图: 2. 選擇內文 (Selectio ...

  4. Oracle,Mysql 获取用户下所有表名,获取表所有的列名及数据类型

    Mysql 下面是mysql获取数据库所有表的语句 select table_name from information_schema.TABLES where TABLE_SCHEMA='Usern ...

  5. 应用安全 - 工具 - 知道创宇 - CEYE检测平台

    DNS Query

  6. Vue-3D-Model:用简单的方式来展示三维模型

    为什么做这个组件 我经常听到前端朋友们抱怨,在网页上展示三维模型太麻烦了.但是这方面的需求又有很多,例如做房地产的需要展示户型.卖汽车的需要展示汽车模型等. 在网页上展示三维模型就只能用WebGL技术 ...

  7. Java基础语法--IDEA快捷键

    Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...

  8. centos7 无法启动网络(service network restart)错误解决办法(转)

    centos7 无法启动网络(service network restart)错误解决办法:(以下方法均为网上COPY,同时感谢原博主分享) systemctl status network.serv ...

  9. mysql数据库问题———登录进去无法操作显示You must reset your password using ALTER USER statement before executing this statement

    linux操作mysql数据库,可以登陆进去,但是操作所有命令都显示You must reset your password using ALTER USER statement before exe ...

  10. P1190排队接水

    这是2010年普及组第二题(话说我怎么只做普及组的题?因为太蒻). 这道题可以用搜索或者模拟来做,果断编了几组例子去分析来模拟,利用了贪心的思想得出:每次比较每个水龙头的空闲时间点,谁早就放到谁那里, ...