Python---TKinter项目实战---屏保
### 项目分析
- 屏保可以自己启动,也可以手动启动
- 一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止
- 如果屏保是一幅画的话,则没有画框
- 图像的动作是随机的,具有随机性,可能包括颜色,大小,运动方向,变形等
- 整个世界的构成是:
- ScreenSaver:
- 需要一个canvas,大小与屏幕一致,没有边框
- Ball
- 颜色,大小,多少, 运动方向,变形等随机
- 球能动,可以被调用
----------------------------------------------------
#pythoncom.CoInitialize()
class RandomBall():
# 自动初始化画布和屏幕尺寸
def __init__(self, canvas, scrnwidth, scrnheight):
# 定义球的初始位置(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
self.xvelocity = -self.xvelocity
self.yvelocity = -self.yvelocity
self.yvelocity = -self.yvelocity
# 在画布上移动图画
self.canvas.move(self.item, self.xvelocity, self.yvelocity)
class ScreenSaver():
# 每次启动程序,球的数量随机
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()
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()
# 调用函数
ScreenSaver()
# 解决的方法是将出生点设置的高点 设置以下位置
# 定义球的初始位置(x,y),此坐标为球的圆心,位置随机生成
#self.xpos = random.randint(60, int(scrnwidth) - 60)
#self.ypos = random.randint(60, int(scrnheight) - 60)
Python---TKinter项目实战---屏保的更多相关文章
- appium+python自动化项目实战(一):引入nose和allure框架
本文将介绍一套比较完整的appium自动化框架,以python为编写脚本语言,是因为python有强大的库,同时易学易懂. 最终的测试框架代码,将在jenkins项目中一键构建,执行自动化测试用例,并 ...
- 学霸笔记系列 - Python Selenium项目实战(一)—— 怎么去验证一个按钮是启用的(可点击)?
Q: 使用 Python Selenium WebDriver 怎么去验证一个按钮是启用的(可点击)? A:Selenium WebDriver API 里面给出了解决方法is_enabled() 使 ...
- 【计算机视觉】OpenCV篇(4) - Pycharm+PyQt5+Python小项目实战
1.下载安装 (1)Pycharm:下载链接 (2)推荐使用Qt Designer来设计界面,如果你装的是Anaconda的话,就已经自带了designer.exe,我这里使用的是Pycharm的虚拟 ...
- appium+python自动化项目实战(二):项目工程结构
废话不多说,直接上图: nose.cfg配置文件里,可以指定执行的测试用例.生成测试报告等.以后将详细介绍.
- Tkinter 项目-屏保
参考教程,以及网上资料,针对小白更好理解 关于tkinter的屏保涉及的知识点和思想 项目分析: 屏保启动方式:手动,自动 敲击键盘或者移动鼠标后,或者其他引发事件,则停止 如果屏保是一幅画的话,则没 ...
- 洗礼灵魂,修炼python(73)--全栈项目实战篇(1)——【转载】前提准备之学习ubuntu
本篇是为项目实战做准备,学习Linux是必备的,不然都不好意思叫全栈对吧?下面是一位资深大神写的文章,够详细,我也不用浪费时间再写了 原文链接:Ubuntu学习——第一篇 内容: 一. Ubuntu简 ...
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- python写的屏保程序
__author__ = 'ChenYan' from random import randint from tkinter import * class Randball(): def __init ...
随机推荐
- Web.Config全攻略
一.认识Web.config文件 Web.config 文件是一个xml文本文件,它用来储存 asp.NET Web 应用程序的配置信息(如最常用的设置asp.NET Web 应用程序的身份验证方 ...
- Delphi XE2 之 FireMonkey 入门(39) - 控件基础: TScrollBox、TVertScrollBox、TFramedScrollBox、TFramedVertScrollBox
Delphi XE2 之 FireMonkey 入门(39) - 控件基础: TScrollBox.TVertScrollBox.TFramedScrollBox.TFramedVertScrollB ...
- oracle存储过程和存储函数
存储过程 1.存储过程简介 下面先来简单介绍一下oracle的存储过程的语法,如下: create or replace procedure Tony_Process ( num in number, ...
- 测开之路一百五十二:基于jquery的ajax实现之load、get、ajax
ajax除了用原生的js实现之外,也可以使用jquery实现,而且用jquery更方便 看一个简单的示例,保留上一篇的content路由和html,实现上一篇一样的功能,点击获取内容,局部刷新 准备一 ...
- C# 导出Excel文件 所导出文件打开时提示“Excel文件格式与扩展名指定格式不一致”
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); ...
- python接口自动化:requests+ddt+htmltestrunner数据驱动框架
该框架分为四个包:xc_datas.xc_driven.xc_report.xc_tools. xc_datas:存放数据,xc_driven:存放执行程序,xc_report:存放生成的报告,xc_ ...
- 个人推荐的两款vue导出EXCEL插件
个人认为前端VUE项目中导出EXCEL比较好的两种方法,均不是我个人原创,我只是收录简单说明,原创地址在下面. 下面推荐两种方法,个人推荐第一种,第二种不做详细讲解,因为作者已经写过博客了,你们可以点 ...
- return语句
定义一个函数:可以定义一个由自己想要功能的函数,以下是简单的规则: (1).函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). (2).任何传入参数和自变量必须放在圆括号中间.圆括号之 ...
- Java基础语法-运算符
1算术运算符 1.1运算符和表达式 运算符:对常量和变量进行操作的符号. 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式. 不同运算符链接的表达式体现的是不同类型的表达式 ...
- JS跨域--window.name
JS跨域--window.name:https://www.jianshu.com/p/43ff69d076e3