python tkinter实现彩球碰撞屏保

利用Tkinter实现彩球碰撞屏保

一、架构与思路

(1)主函数:

main():通过类启动程序;

(2)类:

ScreenSaver():用于定义屏保和主画布,调用球创建、运动等函数;
RandomBall():定义球的基本属性、球创建与运动函数;

(3)对象:单个球,需要创建、运动(包括碰撞反弹),通过循环调用实现多个球并存的效果

create_ball():单个球创建函数;
move_ball():单个球运动函数;

(4)20181215更新:此处对原有屏保程序的退出环节进行了扩展,使用messabox工具建立消息框,询问是否退出,点击“确定”会直接退出,点击“取消”仍留在程序中。

程序架构和思路如下:

二、代码实现

根据上述思路,利用python实现屏保程序,代码如下:

import random
import tkinter
import tkinter.messagebox

class RandomBall():
  '''
  单个球定义、运动的类
  '''
  def __init__(self, root_canvas, width, height):
    '''
    参数说明:
    canvas:从ScreenSaver类中传入的画布
    width,height:从SS类中传入的宽高,即屏幕宽高
    '''

    # 将传入变量赋为RB类的属性
    self.canvas = root_canvas
    self.width = width
    self.height = height

    # 随机生成球的中心坐标
    self.xcenter = random.randint(100, width-100)
    self.ycenter = random.randint(100, height-100)
    # 随机生成球的运动速度
    self.xvelocity = random.randint(8,16)
    self.yvelocity = random.randint(8,16)
    # 计算球的半径
    self.radius = random.randint(60, 100)
    # 利用十六进制随机数与lambda表达式生成球的颜色
    # RGB表示法:三个数字,每个数字的值是0-255之间,表示红绿蓝三个颜色的大小
    # 在某些系统中,直接用英文单词表示也可以,比如red,green
    color = lambda : random.randint(0,255)
    self.color = '#%02x%02x%02x' % (color(),color(),color())

  # 创建球的函数
  def create_ball(self):
    '''
    用构造函数定义的变量值,在canvas上画一个球
    '''
    # tkinter没有画圆形函数
    # 只有一个画椭圆函数,画椭圆需要定义两个坐标,
    # 在一个长方形内画椭圆,我们只需要定义长方形左上角和右下角就好
    # 求两个坐标的方法是,已知圆心的坐标,则圆心坐标减去半径能求出
    # 左上角坐标,加上半径能求出右下角坐标(向右x为正,向下y为正)
    xleftup = self.xcenter - self.radius
    yleftup = self.ycenter - self.radius
    xrightdown = self.xcenter + self.radius
    yrightdown = self.ycenter + self.radius
    # 创建球
    self.item = self.canvas.create_oval(xleftup,yleftup,
                      xrightdown,yrightdown,
                      fill=self.color,
                      outline=self.color)

  # 球运动的函数
  def move_ball(self):
    # 计算球移动后的中心点坐标
    self.xcenter += self.xvelocity
    self.ycenter += self.yvelocity
    # 当球与边框发生碰撞时,需要进行回弹操作,即对应方向的速度取负
    if self.xcenter + self.radius >= self.width:
      self.xvelocity = - self.xvelocity
    if self.xcenter - self.radius <= 0:
      self.xvelocity = - self.xvelocity
    if self.ycenter + self.radius >= self.height:
      self.yvelocity = - self.yvelocity
    if self.ycenter - self.radius <= 0:
      self.yvelocity = - self.yvelocity
    # 在canvas上移动球,前提是create_ball已经调用
    self.canvas.move(self.item, self.xvelocity, self.yvelocity)

class ScreenSaver():
  '''
  屏保定义类
  程序启动
  '''
  def __init__(self):
    # 创建球存储列表
    self.balls = []
    # 随机生成球的数量
    self.num = random.randint(10,20)

    # 利用tkinter生成root窗口
    self.root = tkinter.Tk()
    # 获取屏幕宽、高尺寸
    root_w, root_h = self.root.winfo_screenwidth(), self.root.winfo_screenheight()
    # 取消边框
    self.root.overrideredirect(1)
    # 绑定退出函数与相应动作
    self.root.bind('<Motion>', self.myquit)
    self.root.bind('<Key>', self.myquit)
    self.root.bind('<Any-Button>', self.myquit)

    # 创建画布,配置尺寸与颜色属性
    self.canvas = tkinter.Canvas(self.root, width=root_w, height=root_h)
    self.canvas.pack()

    # 利用循环与RandomBall类在画布上画球,并append到列表中
    for i in range(self.num):
      ball = RandomBall(self.canvas, width=root_w, height=root_h)
      ball.create_ball()
      self.balls.append(ball)

    # 调用球运动函数
    self.run_screen_saver()
    # 启用tkinter时间消息循环mainloop
    self.root.mainloop()

  # 球运动函数
  def run_screen_saver(self):
    # 循环实例化的ball调用move_ball函数
    for ball in self.balls:
      ball.move_ball()
    # 使用after实现递归,通过不断调用各球的move_ball函数,实现位置刷新
    self.root.after(50, self.run_screen_saver)

  # 停止运行
  # 此处e只是利用了事件处理机制,际上并不关心事件的类型
  def myquit(self, e):
    # 扩展:
    # 此屏保程序扩展成,一旦捕获事件,则判断屏保不退出
    # 显示一个Button,Button上显示事件类型,点击Button后屏保才退出
    if tkinter.messagebox.askokcancel("彩球碰撞", '确定退出?'):
      self.root.destroy()
    else:
      pass

if __name__ == '__main__':
  # 启动屏保
  ScreenSaver()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python tkinter库实现气泡屏保和锁屏

    本文实例为大家分享了python tkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下 显示效果如下: 代码: import random import tkinter import threading from ctypes import * class RandomBall(object): """ 定义关于球的类 """ def __init__(self, canvas, screen_width, screen_hei

  • 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: 传入

  • python3.6 tkinter实现屏保小程序

    本文实例为大家分享了python3.6 tkinter实现屏保小程序,供大家参考,具体内容如下 该小程序是在闲着没事的时候,随便写的,就当打发无聊了. 该程序是用python3.6写的,调用了python中的tkinter的库(*python2x与python3x的thinter有很多不同的地方,一定要特别注意!!!) from random import randint from tkinter import * class Randball(): def __init__(self,canv

  • python实现屏保计时器的示例代码

    什么都不说先上图吧,Python初学者实现屏保计时器 原理:利用Python turtle库实现快速画图,每隔一秒钟擦除屏幕,然后获得电脑实时时间,再次画图,呈现动态时间. 关于数字如果画,可以把数字理解为一个晶体管状的8(7segments),不同数字都是其演变而来,只不过对不同数字实现抬笔,落笔动作,可以对不同 import turtle, time def drawGap(): turtle.penup() turtle.fd(5) def drawLine(draw): drawGap(

  • python tkinter实现彩球碰撞屏保

    利用Tkinter实现彩球碰撞屏保 一.架构与思路 (1)主函数: main():通过类启动程序: (2)类: ScreenSaver():用于定义屏保和主画布,调用球创建.运动等函数: RandomBall():定义球的基本属性.球创建与运动函数: (3)对象:单个球,需要创建.运动(包括碰撞反弹),通过循环调用实现多个球并存的效果 create_ball():单个球创建函数: move_ball():单个球运动函数: (4)20181215更新:此处对原有屏保程序的退出环节进行了扩展,使用m

  • python实现二次元图片展示(屏保)

    下面实现内容: 程序的端口是https://www.dmoe.cc/random.php,也是这位谪仙人给的.需要一个参数:return=json.说明文档见:https://www.dmoe.cc/random.php. 卷 Data 的文件夹 PATH 列表卷序列号为 90AF-CB35D:.│  图片展示.py│└─temp 直接敲程序,还需要一个名为temp的文件夹.请提前安装requests.pygame模块. 首先放出备用程序: from requests import get fr

  • 利用Python制作自已的动态屏保

    我的环境 win10 python3.X pycharm 1.编写自己的屏保程序 注意:屏保程序打开就是全屏,可自动循环播放 我的样子如图 1.代码准备 Gitee下载 import os # 必须在加载 加之前 os.environ['SDL_VIDEO_WINDOW_POS'] = "%d, %d" % (0, 30) import random import pygame from pygame.locals import * from math import pi, sin,

  • python tkinter实现屏保程序

    本文实例为大家分享了python tkinter实现屏保程序的具体代码,供大家参考,具体内容如下 该脚本摘录自:2014年辛星tkinter教程第二版 #!/usr/bin/env python from Tkinter import * from random import randint class RandomBall(object): def __init__(self, canvas, screenwidth, screenheight): self.canvas = canvas s

  • python实现屏保程序(适用于背单词)

    今天要给大家分享的是一款自己写的屏保程序,大学大家最头疼的就是四六级的考试了,上次考试做阅读的时候,情不自禁的发呆,想着如果我能在电脑上写一个屏保程序,那么就可以天天记单词了! 开始 首先:我们使用的是python自带的GUI模块,大部分操作网上都可以查到,对于写一些小的交互程序是完全够了.首先我们来定义一个类,这个类可以实列出一个屏幕显示对象,我把它称为Screensaver(). from tkinter import * import tkinter.font as tkFont # 导入

  • Python tkinter实现的图片移动碰撞动画效果【附源码下载】

    本文实例讲述了Python tkinter实现的图片移动碰撞动画效果.分享给大家供大家参考,具体如下: 先来看看运行效果: 具体代码如下: #!/usr/bin/python # -*- coding: utf-8 -*- import time try: from tkinter import * except ImportError: #Python 2.x PythonVersion = 2 from Tkinter import * from tkFont import Font fro

随机推荐