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& q
from random import randint
' d* {) n% L9 z- W7 s
from tkinter import *
, a; j3 {7 R7 G6 q
], D) [+ q8 e
class 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 = scrnwidth
8 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_move
5 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