Tkinter 项目-屏保
参考教程,以及网上资料,针对小白更好理解
关于tkinter的屏保涉及的知识点和思想
项目分析:
- 屏保启动方式:手动,自动
- 敲击键盘或者移动鼠标后,或者其他引发事件,则停止
- 如果屏保是一幅画的话,则没有边框
- 图像的动作是随机的,具有随机性,可能包括颜色,大小,多少,运动方向,变形等
- 整个世界的构成是
- ScreenSaver:
- 需要一个cancas,大小和屏幕一直,没有边框
- Ball
- 颜色,大小,多少,运动方向,变形等随机
- 球能动,可以被调用
- ScreenSaver:
import tkinter import random class RandomBall(): ''' 定义运动的球的类 ''' def __init__(self, canvas, scrnwidth, scrnheight): self.canvas = canvas # ''' # canvas:画布,所有的内容都应该在画布上呈现出来,此处通过此变量传入 # scrnwidth/scrnheight 屏幕宽高 # ''' # 球出现的位置是随机的,此处位置表示求得圆心 # xpos表示位置的x坐标 self.xpos = random.randint(10, int(scrnwidth)-20) # ypos表示位置的y坐标 self.ypos = random.randint(10, int(scrnheight)-20) # 定义球的运动速度 # 模拟运动: 不断的擦掉原来的画,然后在一个新的地方在从新绘制 # 此处xvelocity 模拟x轴方向运动 self.xvelocity = random.randint(4,12) # 同理,yvelocity模拟是y轴方向运动 self.yvelocity = random.randint(4,12) # 定义屏幕的大小 self.scrnwidth = scrnwidth # 定义屏幕的高度 self.scrnheight = scrnheight # 球的大小随机 # 此处球的大小用半径表示 self.radius = random.randint(20,120) # 定义颜色 # RGB表示法:三个数字,每个数字的值是0-255之间,表示红绿蓝三个颜色的大小 # 在某些系统中,之间用英文单词表示也可以,比如red ,green # 此处用lambda 表达式 c = lambda : random.randint(0, 255) self.color = '#%02x%02x%02x'%(c(), c(), c()) def create_ball(self): ''' 用构造函数定义的变量值,在canvas上画一个球 ''' #tkinter没有画圆形的函数 # 只有一个画椭圆的函数,画椭圆需要定义两个坐标 # 在长方形内画椭圆,我们只需要定义长方形左上角和右下角就好 # 球两个坐标的方法是,已知圆心的坐标,则圆心坐标减去半径能求出左上角坐标 # 圆心坐标加上半径能求出右下角坐标 x1 = self.xpos - self.radius y1 = self.ypos - self.radius x2 = self.xpos + self.radius y2 = self.ypos + self.radius # 再有两个对象坐标前提下,可以进行画圆 # fill表示填充颜色 # outline 表示外围边框颜色 self.item = self.canvas.create_oval(x1, y1, x2, y2, \ fill = self.color, \ outline = self.color) def move_ball(self): # 移动球的时候需要控制球的方法 # 每次移动后,球都有一个新的坐标 self.xpos += self.xvelocity self.ypos += self.yvelocity # 或者 self.xpos *= -1 # 然后判断是否撞墙 # 撞了墙就得回头 # 撞墙后的算法判断 if self.xpos + self.radius >= self.scrnwidth or \ self.xpos - self.radius <= 0: self.xvelocity = -self.xvelocity if self.ypos + self.radius >= self.scrnheight or \ 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) self.root = tkinter.Tk() # 取消边框 self.root.overrideredirect(1) # 制作透明窗口 self.root.attributes('-alpha', 0.3) # 任何鼠标移动都需要俏销 self.root.bind('<Motion>', self.myquit) # 按动任何键盘都需要退出屏保 self.root.bind('<Key>', self.myquit) # 得到屏幕大小规格 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__": ScreenSaver()
想学就不晚