参考教程,以及网上资料,针对小白更好理解

关于tkinter的屏保涉及的知识点和思想

  项目分析:

  • 屏保启动方式:手动,自动
  • 敲击键盘或者移动鼠标后,或者其他引发事件,则停止
  • 如果屏保是一幅画的话,则没有边框
  • 图像的动作是随机的,具有随机性,可能包括颜色,大小,多少,运动方向,变形等
  • 整个世界的构成是
    • ScreenSaver:

      • 需要一个cancas,大小和屏幕一直,没有边框
    • Ball
      • 颜色,大小,多少,运动方向,变形等随机
      • 球能动,可以被调用
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()

Tkinter 项目-屏保的更多相关文章

  1. Python---TKinter项目实战---屏保

    ### 项目分析 - 屏保可以自己启动,也可以手动启动 - 一旦敲击键盘或者移动鼠标后,或者其他的引发时间,则停止 - 如果屏保是一幅画的话,则没有画框 - 图像的动作是随机的,具有随机性,可能包括颜 ...

  2. C#制作简易屏保

    前言:前段时间,有个网友问我C#制作屏保的问题,我瞬间懵逼了(C#还可以制作屏保!).于是我去查阅相关资料,下面把C#如何制作屏保的过程及我学习过程的心得也记录下来,希望对需要的人能有帮助. 基本思路 ...

  3. C#制作简易屏保(转)

    C#制作简易屏保[原创] 原始网址: http://www.cnblogs.com/drizzlecrj/archive/2006/10/06/522182.html 2006-10-06 16:25 ...

  4. python写的屏保程序

    __author__ = 'ChenYan' from random import randint from tkinter import * class Randball(): def __init ...

  5. MAC锁屏不断网(快捷键启用屏保)

    第一步:要设定锁定输入密码的设置,进入'系统偏好设置''安全性与隐私',将选项'进入睡眠或开始屏幕保护程序后'打勾,选'立即'. 第二步:到'launchpad'中的'其他'文件夹打开'Automat ...

  6. WPF 制作 Windows 屏保

    分享如何使用WPF 制作 Windows 屏保 WPF 制作 Windows 屏保 作者:驚鏵 原文链接:https://github.com/yanjinhuagood/ScreenSaver 框架 ...

  7. 一个仿windows泡泡屏保的实现

    一个仿windows泡泡屏保的实现 有天看到有人在百度知道上问windows 泡泡屏保该怎么用C#做,一时有趣,就做了一个出来,对于其中几个要点总结如下: 一,屏保程序的制作要求 屏保程序的扩展名是. ...

  8. 仿W8屏保

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Linux关闭休眠和屏保模式

    本人因为特殊需求,想让某台Linux主机始终显示某个程序,显示器不能关机或者休眠或进入屏保模式. 环境:Ubuntu 11.10 最小化模式安装并安装有轻量级桌面openbox(非gnome).因为X ...

随机推荐

  1. C++设计模式——命令模式

    什么是命令模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以 ...

  2. Python——python读取html实战,作业7(python programming)

    查看源码,观察html结构 # -*- coding: utf-8 -*- from lxml.html import parse from urllib.request import urlopen ...

  3. Codeforces 1120D Power Tree [最小生成树]

    洛谷 Codeforces 这题怎么一个中文题解都没有,是不是你们都认为太水了-- 思路 显然可以用dfs序把每个节点变成给一个区间的叶子节点加上某个数. 显然把叶子序列差分一下变为\(a_1,a_2 ...

  4. RIDE的下载及安装

    1.本机配置 windows8.1 python3.6.5,已配置环境变量 2.安装RIDE前需要安装的依赖包(使用pip就可以直接安装) 首先必须有robotframework 例如:pip ins ...

  5. pl/sql学习(6): 引号/程序调试/列中的字符串合并/正则表达式

    有关自治事务的问题: https://www.cnblogs.com/princessd8251/p/4132649.html 我在plsql development学习中遇到的常见问题: (一) 引 ...

  6. cf55D 数位dp记忆化搜索+状态离散

    /* 漂亮数定义:可以整除任意数位上的数 求出区间[l,r]之间的漂亮数个数 因为 dp[i][j][k]:i位前模lcm的值是j,i位前lcm是k的漂亮数个数 */ #include<bits ...

  7. bzoj 3277

    十分之恶心的后缀自动机 (其实是水题,但是我太弱了...) 首先,有一个预备知识:bzoj 2780https://blog.csdn.net/lleozhang/article/details/89 ...

  8. Python目录:

    Python基础 python书写规范--消去提示波浪线 Python 列表(list) Python字符串 Python字典 Python文件操作 Python函数 Python函数-装饰器 Pyt ...

  9. Linux--奇思淫才

    根据进程号找到可执行的文件路径 [ec2-user@baolin ~]$ ll /proc/<pid>/exe lrwxrwxrwx 1 ec2-user ec2-user 0 May 3 ...

  10. 解决使用maven的java web项目导入后出现的有关问题 -cannot be read or is not a valid ZIP file

    解决使用maven的java web项目导入后出现的有关问题 -cannot be read or is not a valid ZIP file   错误问题:虽然查找repository目录下是有 ...