|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
) E1 h" F9 b8 P; R2 ], U8 H__author__ = 'ChenYan'
( G& e; B5 M8 f9 D: \6 K: _8 j9 u* p# v* ?, I+ o
from random import randint
5 A& _) t1 D+ T0 R# q' Tfrom tkinter import *
6 s3 n! Q4 A4 \5 g
" E, Y0 R, n# ?' N2 aclass Randball():
" t" X' m: Z+ W. } I5 Q) U4 y def __init__(self, canvas, scrnwidth, scrnheight):
5 Q: V c) t, X: Z* V4 O #初始化画布5 C$ _% n" ~ b
self.canvas = canvas6 N" ]; |. z4 e
#初始化球的圆心坐标
x& i6 N& Y% b/ ] M3 o self.x_pos = randint(80, int(scrnwidth))# M' V9 V+ O# R0 Z0 W, {. b
self.y_pos = randint(80, int(scrnheight))
, n$ z, B" v4 w3 L7 t$ o% u #球移动的距离
( w9 W6 F- Z, T7 x5 ]7 J* M7 h% {, P6 Z self.x_move = 10% X5 F6 m' e; r' S0 P" [" [
self.y_move = 10
. ~0 b7 O6 _, |1 R3 x" N. R #整个屏幕的宽和高3 V- X# L6 k* q+ x) H
self.scrnwidth = scrnwidth
& D/ P% @5 p z( E( E: W4 m9 g self.scrnheight = scrnheight
( F- I0 e2 A& C5 y #初始化球的半径$ ?$ z7 |) k- g" Z0 z7 _
self.radius = randint(40, 70)$ Y; F4 Z/ Q6 H- [
#随机产生球的颜色
# n* K0 |1 ?; v& n rc = lambda :randint(0,255)- ?6 j. `; j+ e6 \! u& `4 H
self.color = '#%02x%02x%02x' % (rc(), rc(), rc())6 c7 p# l$ A) Y* ?, p
% E1 ~) ^; @% s def create_ball(self):- g( o6 x- ?* k& o; r4 Z2 \+ s
#计算得到用于创建球的四个坐标2 {/ |# d1 {# Z
x1 = self.x_pos - self.radius
5 k, t5 x m' x9 j y1 = self.x_pos - self.radius8 d/ j0 a, Z3 h0 i- X5 L+ }
x2 = self.x_pos + self.radius
0 B! s! t' M# ~, [+ m; e y2 = self.x_pos + self.radius* L+ `! r4 H5 H8 ^+ }
#画球1 _2 X! H4 W0 z: F
self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color) F& W& f# u" u& p8 ~
& U* @- t" p: Y
def move_ball(self):) @- G: C" x# l6 Y% P$ Q
'''按指定的距离移动球,如果球碰到障碍向相反的方向移动'''
' K4 G1 e; A N1 [6 V- r( N self.x_pos += self.x_move1 X g& a/ O) N, d
self.y_pos += self.y_move
- p) b( \9 e3 L6 J* t, w9 G5 R: e! z* J/ v1 U2 r
if self.x_pos >= self.scrnwidth - self.radius:4 o( x! F8 m, c8 ]0 i0 k* i
self.x_move = -self.x_move* A4 S) N# h4 `6 p( q @
if self.y_pos >= self.scrnheight - self.radius:
4 N! H$ q9 z& p* w/ K { self.y_move = -self.y_move
, z$ k7 F) j; V8 l if self.x_pos < self.radius:$ D6 ]2 F. |) D c9 X0 Z/ q: {
self.x_move = abs(self.x_move)
$ A# m: \ e1 L0 n if self.y_pos < self.radius:
0 a6 m" R _8 d" G self.y_move = abs(self.y_move)
, u. t' Q4 v5 _) |& K self.canvas.move(self.item, self.x_move, self.y_move)/ T) f# ]' m2 T( d+ q- U
5 F9 o1 v- j: Fclass Screensaver():
k; C: s2 d' a$ M4 s$ L8 z balls = []2 O& }8 E- W0 g* s; d
def __init__(self, ball_nums):. F8 M7 Q7 A. m% F* j' ^
self.win = Tk()& C8 o; ~# o. g$ s* x2 }
self.width = self.win.winfo_screenwidth()
+ G* S+ S* y3 X" \" Y& @# t4 q- J self.height = self.win.winfo_screenheight() H: q$ X+ m \
self.win.overrideredirect(True)
3 n' O8 Z. n' ] w# y self.win.attributes('-alpha', 0.3)
7 V$ P; D3 [- b( A$ N- d7 ?" l #绑定事件,有任何动作退出屏保
2 v* X! r8 u, d1 m9 `9 D self.win.bind('<Any-Button>', self.exit_screensaver)
* e) w1 L% p( A* L: ]3 V self.win.bind('<Motion>', self.exit_screensaver)5 R" v/ Q% r% w8 ^* U$ v( k! [
self.canvas = Canvas(self.win, width=self.width, height=self.height, bg='#00FFFF')
1 m3 S! c+ F3 O# i6 S3 b# u self.canvas.pack()
% A, i: B* [+ x7 @. K+ Q: f# {$ @& t9 }
for i in range(0,ball_nums):+ G+ [, w3 s6 f
ball = Randball(self.canvas, scrnwidth=self.width, scrnheight=self.height)
( e3 _- k" o- n# @0 ]& R% f ball.create_ball()" v2 O, \% P l# R' r
self.balls.append(ball)
! b3 S( W. T8 g self.run_screensaver()
. N* r" O+ Z) m self.win.mainloop()
- W( g8 _" {: D% D% p$ ^# A! s
& M+ b' Y) [$ B W: J def run_screensaver(self):. ]6 m+ i' l- V' o7 S8 N# I
for ball in self.balls:, g) ~+ a+ c( w. I1 N( ^4 M8 I. x
ball.move_ball(), a4 {7 |" _ n0 Q
self.canvas.after(20, self.run_screensaver)
) ~5 W/ E1 l7 s0 U( P* H Q* H/ u8 X* q" N9 e6 g6 ]
def exit_screensaver(self, event):
% C9 D M# \4 q( d/ ~% |/ | self.win.destroy()' F- Z5 I, U5 a4 z! @( p
8 G+ Y- v- _ {2 M+ F3 u/ ]9 h+ p- ]6 e8 E6 ^6 m9 H8 p( f
def main():
$ L E! [# c9 X Screensaver(15)& v( _- v+ r: c/ R' v3 N
& j% o* o1 t8 _0 g; z( S
) _+ H2 N0 q: n* Yif __name__=='__main__':1 T, C5 g8 V( T' u" B( l
main()$ Z5 z) p `1 ]
复制代码 |
|