### 项目分析

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

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

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

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

-  整个世界的构成是:

  -  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. 阶段3 1.Mybatis_11.Mybatis的缓存_4 mybatis一对多实现延迟加载

    改成单表查询 首先配置的是select.他需要配置的值是accountDao中的方法,查询所有的账户,但是必须有条件.根据用户的id column配置的是id.因为要用user表的id去关联查询 Ac ...

  2. 【Linux 应用编程】进程管理 - 进程、线程和程序

    基本概念 程序和进程的区别 程序是平台相关的二进制文件,只占用磁盘空间.编写完程序代码后,编译为可执行的二进制文件即可. 进程是运行中的程序,占用 CPU.内存等系统资源. 通过 Shell 命令,可 ...

  3. 一个很有意思的小游戏:Dig2China

    最近通关了一个小游戏,游戏故事是这样的:一个美国小男孩想要去中国,他决定从自家后院往下挖,横穿地心去中国,期间经历了很多次失败.但是,每次尝试都能收获一批钱,用这些钱升级钻地机,调整自己的工具,终于在 ...

  4. yum 下载rpm包 安装rpm包依赖关系

    方法一:yumdownloader 工具 1.安装工具包 yum install yum-utils -y 2.下载一个RPM包 yumdownloader <package-name> ...

  5. 【ABAP系列】SAP ABAP 从FTP服务器读取文件到本地

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 从FTP服务器 ...

  6. 【MM系列】SAP MM模块-查看移动平均价的历史记录

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-查看移动平均价的历 ...

  7. 【MM系列】SAP 物料帐下修改物料的价格

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 物料帐下修改物料的价格   ...

  8. redis在ubuntu下的安装

    安装: 1.apt-get install redis 2.接下来输入redis-cli,登陆redis,然后就可以操作redis了 卸载 在ubuntu下卸载redis 1. 卸载软件 apt-ge ...

  9. expect替人进行交互

    expect是一门独立于shell的语言 用expect 执行写好的脚本 #!/usr/bin/expectspawn ssh root@192.168.40.67  (spawn  是expect ...

  10. Win10.输入法(控制面板)

    1.之前 Win7 都是每个进程都是自己的输入法. 但是到了Win10 默认情况下 输入法是全局的,输入法切换成中文 所有进程都变成 中文输入,又是很不方便 也不习惯... 2.感觉 WIn10 真不 ...