python利用tkinter实现屏保
作者:抗原-MHC复合体 发布时间:2022-01-26 05:39:51
标签:python,tkinter,屏保
本文实例为大家分享了python利用tkinter实现屏保的具体代码,供大家参考,具体内容如下
import random
import tkinter
class RandomBall():
'''
运动的球
'''
def __init__(self, canvas, scrn_width,scrn_heigh):
'''
球的构造函数
:param canvas: 传入画布,在画布上进行球的构造
:param scrn_width: 传入屏幕宽度
:param scrn_heigh: 传入屏幕高度
'''
#x,y表示出现的球的圆心
self.ball_x = random.randint(20, int(scrn_width - 20)) #球出现的随机x坐标
self.ball_y = random.randint(10, int(scrn_heigh - 10)) #球出现的随机y坐标
#模拟运动:就是不断地重画球,不断地更新球的位置
self.x_move = random.randint(4, 30) #模拟x方向运动
self.y_move = random.randint(5, 20) #模拟y方向运动
#定义宽度和高度和画布
self.canvas = canvas
self.scrn_width = scrn_width
self.scrn_heigh = scrn_heigh
#球的大小随机
self.rad = random.randint(20, 150) #用半径rad表示球的大小
#定义颜色
c = lambda : random.randint(0, 255)
self.color = "#%02x%02x%02x"%(c(), c(), c())
def creat_ball(self):
'''
用构造函数中的值创建一个球
:return:
'''
#tkinter没有画圆函数,只有椭圆函数
#但在正方形里面画的椭圆就是正圆
#已知圆心坐标和半径,则圆心坐标减半径能求出正方形左上角
#圆心坐标加上半径,能求出右下角
#已知左上角和右上角,可以画出
x1 = self.ball_x - self.rad #左上角的x坐标
y1 = self.ball_y - self.rad #左上角的y坐标
x2 = self.ball_x + self.rad #右下角的x坐标
y2 = self.ball_y + self.rad #右下角的y坐标
#在有对角坐标的情况下就可以创建圆
self.item = self.canvas.create_oval(x1, y1, x2, y2, fill = self.color, outline = self.color)
# 球动
def move_ball(self):
self.ball_x += self.x_move #球移动后的新x坐标
self.ball_y += self.y_move #球移动后的新y坐标
# 碰壁回弹判断
if self.ball_x + self.rad >= self.scrn_width: #撞到了右边的墙
self.x_move = -self.x_move
if self.ball_x - self.rad <= 0: #撞到了左边的墙
self.x_move = -self.x_move
if self.ball_y + self.rad >= self.scrn_heigh: #撞到下面的墙
self.y_move = -self.y_move
if self.ball_y - self.rad <= 0: #撞到上面的墙
self.y_move = -self.y_move
self.canvas.move(self.item, self.x_move, self.y_move) #利用x,y的移动距离控制球的移动快慢
class ScreenSaver():
'''
可以被启动的屏保
'''
#创建一个list装创建的球
def __init__(self):
self.balls = list()
self.nums_balls = random.randint(6, 20) #产生随机数量的球
self.baseFrame = tkinter.Tk() #启动界面
self.baseFrame.overrideredirect(1) #取消边框
#移动鼠标则退出屏保
self.baseFrame.bind("<Motion>", self.my_quit)
self.baseFrame.attributes('-alpha', 1)
#键盘任意键退出屏保
self.baseFrame.bind("<Key>",self.my_quit)
#得到屏幕的宽和高
w = self.baseFrame.winfo_screenwidth()
h = self.baseFrame.winfo_screenheight()
#创建画布
self.canvas = tkinter.Canvas(self.baseFrame, width = w, height = h)
self.canvas.pack()
#在画布上画球
for i in range(self.nums_balls):
ball = RandomBall(self.canvas, scrn_width = w, scrn_heigh = h)
ball.creat_ball()
self.balls.append(ball)
self.run_screen_saver()
self.baseFrame.mainloop()
#球动函数
def run_screen_saver(self):
for ball in self.balls:
ball.move_ball()
#在sleep100ms以后启动第二个参数函数,相当于100ms动一次
self.canvas.after(100, self.run_screen_saver)
#当事件发生时,传入event,退出屏保
def my_quit(self, event):
#析构(退出)屏保
self.baseFrame.destroy()
if __name__ == "__main__":
#启动屏保
ScreenSaver()
来源:https://blog.csdn.net/weixin_43437546/article/details/86547817
0
投稿
猜你喜欢
- 本文实例讲述了python获取mp3文件信息的方法。分享给大家供大家参考。具体如下:将代码生成.py文件放在目录下运行,可以获取该目录的所有
- 此文仅当学习笔记用.这个实例是在Python环境下如何爬取弹出窗口的内容,有些时候我们要在页面中通过点击,然后在弹出窗口中才有我们要的信息,
- PyCharm 应该是大多数 python 开发者的首选 IDE,每天我们都在上面敲着熟悉的代码,写出一个又一个奇妙的功能。它是帮助用户在使
- 一、前言进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或者多个进程,一般来说,进程是通过系统CPU
- keras 模块里面为我们提供了一个预训练好的模型,也就是开箱即可使用的图像识别模型趁着国庆假期有时间我们就来看看这个预训练模型如何使用吧可
- 在程序实际应用中,少不了要进行字符串拼接的操作。下面介绍一下Python语言中四种字符串拼接的方式。1. 算术运算符拼接在Python中算术
- 本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧高阶函数1、可以使用函数对象作
- 我们知道两个 set 对象之间,可以取交集、并集、差集、对称差集,举个例子:s1 = {1, 2,
- 环境OpenCV3.4.16(C++)opencv-contrib-python 4.5.4.60(Python)验证Opencv函数fil
- 看到sam关于max-height的文章,觉得按捺不住了。sam注重于样式表的写法,过多的要求div+css的布局,sam可是追求艺术的人哦
- 本文实例讲述了Python实现通过文件路径获取文件hash值的方法。分享给大家供大家参考,具体如下:import hashlibimport
- 计算机一般来说是需要定期的清理,系统的内存不能无限延伸,同时有一些不需要的文件也可以得以清除掉。有些人会使用os.remove来进行文件的清
- 背景golang版本:1.16之前遇到的问题,docker启动时禁用了oom-kill(kill后服务受损太大),导致golang内存使用接
- mysql出现ERROR : (2006, 'MySQL server has gone away') 的问题意思就是指cl
- 在SQL Server数据库的维护或者Web开发中,有时需要在存储过程或者作业等其他数据库操作中调用其它的存储过程,下面介绍其调用的方法一、
- 需求有一个表,里面数据量比较大,每天一更新,其字段可以通过xml配置文件进行配置,即,可能每次建表的字段不一样。上游跑时会根据配置从源文件中
- 本文实例讲述了Python使用迭代器捕获Generator返回值的方法。分享给大家供大家参考,具体如下:用for循环调用generator时
- var fso = new ActiveXObject("Scripting.
- 安装SQL Server 2005弄了好久,终于可以了。。。期间问题重重,想拿出来和大家一同分享的。第一种错误显示:无法在com+目录中安装
- J2ME是利用HttpConnection建立HTTP连接,然后获取数据,ASP也是利用HTTP协议,因而可以利用J2ME与ASP建立连接,