|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
3 [- B, y7 A- {
__author__ = 'ChenYan'1 _' t6 D: `4 L) t4 r. K% q9 R% p
; Q" \. j$ ]0 R, l1 H, S- q: qfrom random import randint
6 S6 D5 ^0 O8 e+ |. D" }& }+ z2 x4 Gfrom tkinter import *" r! u* Z. \; T8 @4 t& ]7 d+ j
9 W& v' _% R. t3 d$ Q: G) H# P" b
class Randball():
6 {2 @0 ^$ y$ G2 Q def __init__(self, canvas, scrnwidth, scrnheight):
9 D6 e; }5 A7 Y/ `) c7 A #初始化画布
$ h: Q" K; r( r self.canvas = canvas
# r4 y4 c) d' Y #初始化球的圆心坐标
' Y# ^% s& x V self.x_pos = randint(80, int(scrnwidth))7 x6 `4 R/ A5 u5 L* n& t2 ]& Z
self.y_pos = randint(80, int(scrnheight)) o- G5 {& U8 X7 q
#球移动的距离
1 l) u+ Z3 i M& t# w self.x_move = 107 f* `2 S0 C* ?! ~4 l) O& }
self.y_move = 10
" z9 v4 v$ y& Q0 e- n& R$ ~ #整个屏幕的宽和高
0 f& |4 t, S# S7 K f self.scrnwidth = scrnwidth
$ O2 J' S, A0 L* K$ R self.scrnheight = scrnheight
( ?& T3 I4 L5 A& I( W2 ~ #初始化球的半径 c' r9 f# M5 M# f! f) }5 q1 ]7 A0 K
self.radius = randint(40, 70)
# M1 p+ X% d0 t5 S2 G7 b$ W #随机产生球的颜色
* U5 X* ~! e7 d* R' j6 G5 G rc = lambda :randint(0,255)) _2 k' q7 R* ?9 K) \
self.color = '#%02x%02x%02x' % (rc(), rc(), rc())
4 ] h6 I* G6 @- F
) J$ T7 S3 N1 G" s. n5 g def create_ball(self):2 n5 M- j- @' t( q- X9 ?
#计算得到用于创建球的四个坐标) a, Z' A5 R/ K" v
x1 = self.x_pos - self.radius8 W1 C. ]( j4 j% `# Z* U
y1 = self.x_pos - self.radius+ i. e6 j( Z) Z0 q
x2 = self.x_pos + self.radius
1 S; K' F- J7 ^$ R y2 = self.x_pos + self.radius& e: N, v( t1 L- T* S; X/ u9 D
#画球
+ `; \% ]0 t0 C3 U self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color)
- M0 S( b5 h! p9 J' v' P0 f
, s7 Z4 X0 y+ I# O1 ^ def move_ball(self):
7 e- R8 ?, r# n. v7 C6 D7 | '''按指定的距离移动球,如果球碰到障碍向相反的方向移动''', S7 N A4 o$ H/ e( c& Y
self.x_pos += self.x_move
& z2 L8 W {- W+ j2 a self.y_pos += self.y_move8 s/ F2 u9 W$ X- q- I; n( [; W
4 _7 R% B% k/ Z4 ^' T; m9 e
if self.x_pos >= self.scrnwidth - self.radius:
b5 s, D6 c- y. l2 s self.x_move = -self.x_move
% V; y1 \3 ?- y5 _3 n2 d if self.y_pos >= self.scrnheight - self.radius:
% m, T- |! T, i" P1 G* `, D self.y_move = -self.y_move
# z5 f1 N! O( ^, E if self.x_pos < self.radius:$ `' e0 `. g- a) i" m
self.x_move = abs(self.x_move)- v& `& [: c, t* c- a- ?
if self.y_pos < self.radius:) u% P2 x' P" b0 P% w" J* T$ [' K
self.y_move = abs(self.y_move)) @4 l1 `- E8 y; D/ ^9 s
self.canvas.move(self.item, self.x_move, self.y_move)
8 k! w8 ]5 _5 f
3 j# C$ N' c0 y+ I) Zclass Screensaver():
- u6 ?3 D4 ]- P! h2 @ balls = []
0 c5 B$ k: b' z ^# V def __init__(self, ball_nums):5 N: c; p6 T/ W4 f, c! j
self.win = Tk()5 t9 q' h* y$ v. S7 x4 }
self.width = self.win.winfo_screenwidth()
3 m1 U9 H% S# S self.height = self.win.winfo_screenheight()& Y0 ^3 l2 a6 `+ q) i
self.win.overrideredirect(True)/ r+ H- g4 K5 x% j* p2 }" z4 p. W
self.win.attributes('-alpha', 0.3)1 |( d$ }% U7 k6 p2 a
#绑定事件,有任何动作退出屏保8 C- x, C9 G" P0 Q. r' x. `
self.win.bind('<Any-Button>', self.exit_screensaver)4 L$ Y- b* m9 e& X
self.win.bind('<Motion>', self.exit_screensaver)& I; C) {& m% f
self.canvas = Canvas(self.win, width=self.width, height=self.height, bg='#00FFFF')1 s, e8 N. F3 j9 p" L5 u# \
self.canvas.pack()
9 S8 Z' \" t9 Q2 r# m
' ~- W% s( i0 i& T) ]+ y N, @ for i in range(0,ball_nums):. ]" x& g0 O* |- T% i f
ball = Randball(self.canvas, scrnwidth=self.width, scrnheight=self.height)
- T) j5 e% q- F' B& \9 K: P ball.create_ball()/ N! M, E0 e/ M. |) B" h
self.balls.append(ball)
: k. d% z/ k6 Z7 u9 V# E: p% k5 r self.run_screensaver()
1 b D; s' |+ w2 _ self.win.mainloop()
. j: z( N5 U. K1 F4 g! q
m: ^3 { }: I( T& X C* v- {- Y def run_screensaver(self):2 \& H( ~/ ^( N1 j
for ball in self.balls:
6 K+ H5 n" I S) S( ~ ball.move_ball()
$ r1 ^+ k, C' j, O self.canvas.after(20, self.run_screensaver)1 t+ |0 ]' U0 D8 W8 }
# a: k! L9 p' K
def exit_screensaver(self, event):
: `# ~$ J/ [! s+ f* V4 ? self.win.destroy()+ u& o; T, e% F% }* `
) t2 Z0 ]$ V7 Y5 W
& t' g9 Y. b) Idef main():- q- Z$ w/ B9 O w6 b$ W
Screensaver(15)( n! ^0 x- }! k: q
7 ]5 ^9 ~5 L5 R: T3 S8 w. [1 z/ l8 C# O
+ F6 y @3 J/ |, K+ e
if __name__=='__main__':
/ [- f( }0 {' a3 Z main()
2 b9 N6 a7 O* w( `2 j1 g7 |复制代码 |
|