python画球体的代码_python使用tkiner创建一个小球滚动的代码

# tkinter - 项目实战

'''

- 项目分析

- 屏保可以自己启动,也可以手动启动.

- 一旦敲击键盘或者移动鼠标,或者引发事件,则停止.

- 如果屏保是一幅画的话,则没有画框.

- 图像的动作是随机的,具有随机性.(包括颜色,大小,运动方向,变形)

- 整个世界的构成是

- ScreenSaver

- 需要一个canvas. 大小等于屏幕大小,没有边框.

- Ball

- 包括颜色,大小,运动方向,变形 => 随机

- 球能动, 可以被调用.

'''

import tkinter as tk

import random

class RandomBall:

'''

定义一个运动球的类

'''

def __init__(self,canvas,scrnWidth,scrnHeight):

'''

canvas:画布,所有的内容都应该在画布上呈现出来.此处通过此变量传入

scrnWidth/scrnheigh:屏幕宽高

'''

self.canvas = canvas # 这个是自己添加的.添加原因是下方代码并没有 self.canvas

# 球出现的初始位置要随机.此位置表示圆心

# xpos表示位置的x坐标

self.xops = random.randint(10,int(scrnWidth)-20)

# ypos表示位置y的坐标

self.yops = random.randint(10,int(scrnHeight)-20)

# 定义球运动的速度 => 模拟运动: 动画的逻辑就是重绘 =>模拟运动,不断的擦掉旧事物,重新绘制新事物

self.xvelocity = random.randint(4,20)

self.yvelocity = random.randint(4,20)

# 定义屏幕的宽度和高度

self.scrnWidth = scrnWidth

self.scrnHeight = scrnHeight

# 球的大小随机.

# 此处球的大小用半径表示

self.radius = random.randint(20,80)

# 定义颜色

# RGB表示法:三个数字,每个数字的值是0-255之间,表示RGB

c = lambda:random.randint(0,255)

self.color = '#%02x%02x%02x'%(c(),c(),c()) # 这个地方存疑

def create_ball(self):#定义一个函数

'''

用构造函数定义的变量值,在canvas上画一个球

'''

# tkinter没有画圆形的函数

# 只有一个画椭圆函数,画椭圆需要定义两个坐标

# 在一个长方形内画椭圆,我们只需要定义长方形左上角和右下角就好 => 如果是一个正方形,那么椭圆就是圆

# 求两个坐标的方法是 (圆心 - 半径)

x1 = self.xops - self.radius

y1 = self.yops - self.radius # 椭圆的左上角

x2 = self.xops + self.radius

y2 = self.yops + self.radius # 椭圆的右下角

self.item = self.canvas.create_oval(x1,y1,x2,y2,fill=self.color,outline=self.color) # 绘制椭圆

def move_ball(self):

# 移动球的时候,控制球的方向

# 每次移动后,球都有一个新的坐标

self.xops += self.xvelocity

self.yops += self.yvelocity

# 以下判断是否会撞墙 => 撞墙的算法判断

if self.xops +self.radius>=self.scrnWidth: #撞到右边的墙了

self.xvelocity*=-1

elif self.xops+self.radius<=0:

self.xvelocity*=-1

if self.yops + self.radius >=self.scrnHeight:

self.yvelocity*=-1

elif self.yops +self.radius <= 0:

self.yvelocity *=-1

# 在画布上移动动画

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 = tk.Tk()

# 取消边框

self.root.overrideredirect(1)

# 任何鼠标移动都要取消

self.root.bind('',self.myquit)

# 同理,安东任何键盘都需要退出屏保

# 得到 屏幕大小规格

w,h = self.root.winfo_screenwidth(),self.root.winfo_screenheight()

self.canvas = tk.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(20, self.run_screen_saver)

def myquit(self,e):

# 此处只是利用了事件处理机制

# 实际上并不关心事件的类型

# 作业:

# 此屏保程序扩展成,一旦捕获事件,则判断屏保不退出

# 显示一个Button,Button上显示事件类型,点击Button后屏保

# 才退出

self.root.destroy()

if __name__ == "__main__":

ScreenSaver()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值