|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
O; T H1 @1 M U# I* P__author__ = 'ChenYan'
0 E! q8 o# y/ d; z; Z V1 N& S2 H- B$ \# |1 ^1 ?& a" a
from random import randint
. F) u0 @/ e1 W0 |, S) Y; ^from tkinter import *$ B. J4 n* u* `$ k: G& s) a- g
7 K7 g1 n' K) g4 x( Kclass Randball():5 H. w2 D2 [. X! @' L1 `
def __init__(self, canvas, scrnwidth, scrnheight):# f" ^+ l; X) P3 b% @$ ^
#初始化画布
% ^% N1 e) o8 H% H) Y self.canvas = canvas
p! z# F9 ]& b+ h; d' ? #初始化球的圆心坐标
& Y' W+ T$ _9 _ Z self.x_pos = randint(80, int(scrnwidth))4 M- D/ J( u% @2 @) D
self.y_pos = randint(80, int(scrnheight))
: `0 D" U& P4 e1 D #球移动的距离
. \; f' a5 I8 }' r) \ self.x_move = 10
4 z0 u9 I L2 w W self.y_move = 10
+ @- r+ _, S+ O6 }7 P* t9 I #整个屏幕的宽和高' d# Q1 W8 }0 c3 B
self.scrnwidth = scrnwidth
; M$ I* @1 s9 h( F0 ?" n3 F self.scrnheight = scrnheight. t0 i. I5 t: A$ H
#初始化球的半径4 d( Y* ]* o o8 Y
self.radius = randint(40, 70)# ^" ]$ x% s* }, o! c, |; p2 T8 l! h
#随机产生球的颜色1 G; |8 |3 m9 a
rc = lambda :randint(0,255)
4 x+ H- Y2 Z: d5 E+ l6 O h3 { self.color = '#%02x%02x%02x' % (rc(), rc(), rc())
* k1 o4 D- d; @% K3 E5 z- g5 ~0 L3 L; d; o$ w
def create_ball(self):" F% x% k9 `4 a. f% u
#计算得到用于创建球的四个坐标
* }) A1 E3 y/ J4 c3 G x1 = self.x_pos - self.radius" A& _! X- s- a" {; P/ P
y1 = self.x_pos - self.radius
( P0 C/ n3 J; O' M& k7 u& ? x2 = self.x_pos + self.radius" j. O" U: a' U: z
y2 = self.x_pos + self.radius' m2 t' B! K! H# y$ j1 u. p
#画球
$ k) Q0 t/ S; v! _( F$ x self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color)
' @" q8 e4 L# D& H8 ?+ d9 f# C0 w, k0 U4 k
def move_ball(self):
1 n( Y( f8 n$ D/ b2 p '''按指定的距离移动球,如果球碰到障碍向相反的方向移动'''
0 m7 d7 X; F) O3 [ ] self.x_pos += self.x_move
4 N, x, ~0 {8 e4 D self.y_pos += self.y_move1 Z5 i l+ D2 j$ z: r4 B7 _9 r2 J
; a# I7 Q% X9 X3 ~' ?6 y, X4 J if self.x_pos >= self.scrnwidth - self.radius:& y9 K: b( l5 N2 |* t
self.x_move = -self.x_move7 |8 [/ B* A8 |- ?7 B1 ~
if self.y_pos >= self.scrnheight - self.radius:
' u- h; |% p' B2 p. \$ v self.y_move = -self.y_move
: @" Q, D2 y2 F g V7 [0 c" {0 X if self.x_pos < self.radius:
: D2 |9 N& d, t2 R self.x_move = abs(self.x_move)
7 h: a* m& B2 f, C# ?5 c: z* j if self.y_pos < self.radius:$ }0 Y; H% ^) _$ p/ e
self.y_move = abs(self.y_move)
- [$ \! D5 s# ~! Z) M( P1 m. ] self.canvas.move(self.item, self.x_move, self.y_move)
1 P! P3 m. j. e, i9 ^- C# v" p
2 W- A! X1 g- T U" \7 G$ O7 T# hclass Screensaver():
0 ~1 v3 ]: ~7 }9 K* d0 l+ I2 z balls = []
5 A4 W) z1 x8 P- T9 ~ def __init__(self, ball_nums):
( Y$ m3 `9 m/ i$ T$ u Q self.win = Tk()
s9 K% ~+ S' T) \7 }- W* F0 W& K self.width = self.win.winfo_screenwidth()+ H% O. Z# z1 e+ ^- b+ i& J* X
self.height = self.win.winfo_screenheight()
' W" l: j; W! l& j self.win.overrideredirect(True)
! {0 p) M, {, r; t& C self.win.attributes('-alpha', 0.3)
# k! y1 O9 |$ P" l! i8 m #绑定事件,有任何动作退出屏保
$ q4 X$ G) W @. ?- f/ S self.win.bind('<Any-Button>', self.exit_screensaver)
1 M, W! v! a# F& Y1 W self.win.bind('<Motion>', self.exit_screensaver)
/ y8 J! k( x# x; u3 O self.canvas = Canvas(self.win, width=self.width, height=self.height, bg='#00FFFF')
# @& U7 q2 K- Z' h9 d1 c% u self.canvas.pack()7 |3 a+ j# m8 J' w2 B+ x: ^
0 I4 B0 v% Y& f J1 ?' k
for i in range(0,ball_nums):
: c* g: ]$ U1 {/ E3 l+ P6 f ball = Randball(self.canvas, scrnwidth=self.width, scrnheight=self.height)" n& K% ]1 K6 S5 V+ q: d7 F
ball.create_ball()! y6 K0 K* U' z, K* Q t
self.balls.append(ball)
" B; V9 H0 C# q7 u. A# e ?- m! U self.run_screensaver()
Z& T2 m: k! |# ?5 K$ A self.win.mainloop()4 J; g! u/ D: b% v; V: j
) {& ]" W0 t! m/ r7 a4 v0 ? def run_screensaver(self):
( M; D0 a3 U& A for ball in self.balls:
) _: I, _" `1 W0 S' Y$ Z. O ball.move_ball()0 }4 M2 k4 K1 C) P) v
self.canvas.after(20, self.run_screensaver)
0 l/ k& @* A3 e7 S- j2 ~# s+ B2 h4 `0 ?) l: L$ ~- r
def exit_screensaver(self, event):9 D& ^, g3 ~7 [8 d! u
self.win.destroy()
A/ x! |- m* E8 }7 k& b6 I' r7 Q. P2 | k) D/ K. b% ^/ O" S& _6 k
; z, H }$ [+ n9 X1 Mdef main():
$ e. S2 r* s& n% t2 U Screensaver(15)- {" u1 z8 X* l. `; X
& F! K, u9 G& V3 C7 l
- x7 b3 f% g1 W9 V2 v$ r
if __name__=='__main__':3 i5 u" b- u2 _( H, V. Z+ W
main()# F% C/ N. m) E" U7 K3 `
复制代码 |
|