python tkinter---项目实战---动态屏保

其实这个东西挺简单的,就是一些细节,调了会终于调出来,代码分享给现在正在学Python的小白们,以供参考。

在这里插入图片描述

import random
import tkinter
class RandomBall():
'''
定义运动的球
'''
def __init__(self, canvas, scrnwidth, scrnheight):
self.canvas = canvas
self.scrnwidth = scrnwidth
self.scrnheight = scrnheight
# 小球的初始坐标
self.xpos = random.randint(100, int(self.scrnwidth) - 100)
self.ypos = random.randint(100, int(self.scrnheight) - 100)
# 小球的移动速度
self.xvelocity = random.randint(4, 20)
self.yvelocity = random.randint(4, 20)
# 窗口的宽高
self.scrnwidth = scrnwidth
self.scrnheight = scrnheight
# 球的大小随机
self.radius = random.randint(20, 120)
# 定义颜色
c = lambda: random.randint(0, 255)
self.color = "#%02x%02x%02x" % (c(), c(), c())
def create_ball(self):
'''
用构造函数定义的变量值,在canvas上画一个球
'''
self.x1 = self.xpos - self.radius
self.x2 = self.xpos + self.radius
self.y1 = self.ypos - self.radius
self.y2 = self.ypos + self.radius
self.item = self.canvas.create_oval(self.x1, self.y1, self.x2, self.y2,fill=self.color,outline=self.color)
def move_ball(self):
# 控制球的方向
# 每次移动后,球都有一个新的坐标
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():
'''
定义屏保的类
可以被启动
'''
balls = list()
def __init__(self):
# 每次启动球的数量随机
self.num_balls = random.randint(6, 20)
self.root = tkinter.Tk()
# 取消边框
self.root.overrideredirect(1)
# 任何移动鼠标都需要取消
# 得到屏幕规格
w, h = self.root.winfo_screenwidth(), self.root.winfo_screenheight()
# 创建画布,包括画布的归属,规格
self.canvas = tkinter.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(50, self.run_screen_saver)
def myquit(self, e):
# 销毁函数
self.root.destroy()
if __name__ == "__main__":
ss = ScreenSaver()

猜你喜欢

转载自blog.csdn.net/weixin_42739047/article/details/83541762