EDA365电子论坛网

标题: python写的屏保程序 [打印本页]

作者: hasky    时间: 2016-5-30 17:38
标题: python写的屏保程序
+ k$ n3 }3 {6 J/ r/ n( l5 @8 C3 j
__author__ = 'ChenYan'' _$ E) i- k& p  n; v0 j7 n

8 H' B( w% G% p& g; m) r9 P& qfrom random import randint
' d* {) n% L9 z- W7 sfrom tkinter import *
, a; j3 {7 R7 G6 q
  ], D) [+ q8 eclass Randball():" U1 h6 ^: c0 E# A9 A/ R, ?
    def __init__(self, canvas, scrnwidth, scrnheight):
4 Q; c7 T  d; z- g2 _        #初始化画布
* L+ s8 ^* Z+ U        self.canvas = canvas
, V. [# H; l) q" {( g- A2 O) w        #初始化球的圆心坐标
0 q* H+ `' A5 I- k        self.x_pos = randint(80, int(scrnwidth))
# {( w/ `6 @; _5 U; f7 Q        self.y_pos = randint(80, int(scrnheight))
# X2 i+ i! ?& @: m- R* E        #球移动的距离
, a, J+ Y# `3 [! Q        self.x_move = 10
+ R: V! [2 N/ y1 z7 `        self.y_move = 10# U+ @" T8 O% R4 E5 ?6 m
        #整个屏幕的宽和高: a( l/ k3 M) ^" ~( V7 |
        self.scrnwidth = scrnwidth8 g. v% l& v% B& \% |* v) u
        self.scrnheight = scrnheight% Y% l) q1 S& b, c: y, H- n3 o
        #初始化球的半径
5 F$ z+ u, b0 \        self.radius = randint(40, 70)& k+ z4 T# E2 L$ O" m1 I8 U
        #随机产生球的颜色' H% d7 g( ^8 l6 |+ A
        rc = lambda :randint(0,255)
, K8 k  p) j% c  B: p# j        self.color = '#%02x%02x%02x' % (rc(), rc(), rc())' n1 ?) T, ]0 t7 r$ r% X; e

8 l' j6 n1 Y  q* T0 c    def create_ball(self):$ c3 Z4 Z" v* K  ?0 n; {
        #计算得到用于创建球的四个坐标
- B/ g6 A& c# j        x1 = self.x_pos - self.radius
8 a5 I( y' B9 }; g+ [        y1 = self.x_pos - self.radius* |; P. |0 e+ m
        x2 = self.x_pos + self.radius! w4 W# f5 s: x2 m" C7 [2 u' Q
        y2 = self.x_pos + self.radius' u" }/ ?' l; g, D' `1 y9 F+ R
        #画球3 ]% v2 M9 [. f7 j0 T
        self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color)& v$ \! W4 V, b$ H1 i5 X
" I8 ~) _) T! I: w7 }
    def move_ball(self):) T% y6 r4 ?" n2 k3 a" k
        '''按指定的距离移动球,如果球碰到障碍向相反的方向移动'''
6 [- b3 ^( u) ~; B' E9 j- w        self.x_pos += self.x_move5 W  C' X: A/ y- A: u* K
        self.y_pos += self.y_move- X4 h. _) ^! u' F8 b
0 C' I9 k+ s! Z% b% R! S7 u
        if self.x_pos >= self.scrnwidth - self.radius:
+ o/ J* a6 L* R4 p6 t            self.x_move = -self.x_move, V! R! b$ B* T9 f! j  D
        if self.y_pos >= self.scrnheight - self.radius:
1 i* u. W8 q% z            self.y_move = -self.y_move/ }3 T& c, P' H; \- O8 M7 x
        if self.x_pos < self.radius:6 ?/ e* ~1 P. y
            self.x_move = abs(self.x_move)
3 o- o) b+ Q4 ~% ~# n        if self.y_pos < self.radius:. u, C1 h; K$ g9 g* v
            self.y_move = abs(self.y_move): E: ~% \( l* z' p3 _8 P* ?1 X: r& l+ G
        self.canvas.move(self.item, self.x_move, self.y_move)! X4 ?3 P' E& K
( j! w  S5 w+ k5 [% c! a# B  I
class Screensaver():' S! }& N3 P1 Z1 z- O. U0 `
    balls = []
( |! p8 B  q7 h% U( W) w& F    def __init__(self, ball_nums):
% X8 P7 ~( b5 p& C+ o* K( [" g6 Z        self.win = Tk()
* r! L% E1 b6 @7 E, P2 L        self.width = self.win.winfo_screenwidth()
6 R- D" n$ Z2 e7 i. V* D        self.height = self.win.winfo_screenheight()
! y+ O. |9 c- r3 P( Y2 ~5 B! ]        self.win.overrideredirect(True)
4 l6 t; b# Z) \: g" g& L+ Y+ ~. s+ ^        self.win.attributes('-alpha', 0.3)
! j5 j) ~- }1 B. Q( w7 U7 g        #绑定事件,有任何动作退出屏保
, X" V/ F' _$ s. ?' s        self.win.bind('<Any-Button>', self.exit_screensaver)
+ q9 Y7 u. O' O% }* l# F9 s        self.win.bind('<Motion>', self.exit_screensaver)& X# g2 S3 U- B# V& y
        self.canvas = Canvas(self.win, width=self.width, height=self.height, bg='#00FFFF')( s' }' h% [8 x& f; g0 z8 A: F; U" V
        self.canvas.pack()
9 u. u8 H; [1 s
* d/ Z3 `' i% l        for i in range(0,ball_nums):$ c% {8 `+ K5 K1 Z
            ball = Randball(self.canvas, scrnwidth=self.width, scrnheight=self.height)& ~/ f; S) _/ ^; ^) ]" R( D0 Q" x
            ball.create_ball()' L- }% p# w/ J3 x
            self.balls.append(ball)& L, \) j' t/ p; y5 n% W
        self.run_screensaver()& R( }& Y, U7 v1 E) r0 m
        self.win.mainloop()8 o) h8 O& M+ y
) G% r: q+ e% T/ U2 j5 r
    def run_screensaver(self):/ j$ `0 G' X* t( a; ?
        for ball in self.balls:  ]0 N* X* b/ U5 O( @2 D$ D' r
            ball.move_ball()
& ^7 L6 v  |8 P0 _6 e( P! x        self.canvas.after(20, self.run_screensaver); W5 B' K0 T) G! J" R! w9 x1 O

3 F6 [; t4 `0 f/ l) F+ `: l; {1 w3 A( V    def exit_screensaver(self, event):  K% ^1 o* Y, `4 L$ |6 b1 i, K# ]
        self.win.destroy()
8 |' o% l/ S- x* x: J3 [( {0 R. l5 G# E
4 O' A4 f+ P3 E, B; d. b
def main():
4 Q- C9 B8 Q: P2 ?' d/ W    Screensaver(15)7 R9 S! s- i$ h( q
! t& X! T7 T& c$ A8 r( E: w
* _( h. N4 P% v. E/ n& P8 M
if __name__=='__main__':
" A( D; d8 M: I2 F+ W* n8 K    main()5 U$ K9 u, g4 C0 s% V
复制代码
作者: Haiting32451    时间: 2016-6-1 16:29

+ x6 b. \* m. `3 f6 M  S学习了  挺好的资料  谢谢分享啊
作者: cyxs    时间: 2016-6-2 15:29
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O
作者: zjfc78154    时间: 2016-9-21 15:58
牛逼,刚接触




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2