找回密码
 注册
关于网站域名变更的通知
查看: 455|回复: 3
打印 上一主题 下一主题

python写的屏保程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2016-5-30 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

! P3 F4 r5 u8 ~__author__ = 'ChenYan'8 m& e8 {, H$ f. P

; `; R( ^( _) Kfrom random import randint3 i9 D  {8 o' b* F
from tkinter import *
/ N1 W" R3 z# E3 [  \8 z* J$ N
3 S3 H+ Q! {5 J0 Yclass Randball():
! e) R  e8 S4 U* {* J/ i( x    def __init__(self, canvas, scrnwidth, scrnheight):+ U+ D5 I& [' _6 J8 e/ x
        #初始化画布$ d5 B/ J( E) ^, B8 j1 k
        self.canvas = canvas3 n( D3 ~/ \4 ?  p1 i
        #初始化球的圆心坐标
) `# d4 S6 T$ z6 ]; A8 M        self.x_pos = randint(80, int(scrnwidth))
' l) K" r2 ~/ o  J& Q        self.y_pos = randint(80, int(scrnheight))
: `- }5 J, l0 v  d6 D, ~/ ^' n0 ?5 g        #球移动的距离( l. [: `' m0 P! w2 t" r: x- p! Q
        self.x_move = 10
  F# W, e% A3 v  y        self.y_move = 10  o7 \" i9 D5 C, J- G5 P0 ~
        #整个屏幕的宽和高, y/ j+ R9 y! K8 O
        self.scrnwidth = scrnwidth4 X& e( k9 \$ U3 A/ E+ e
        self.scrnheight = scrnheight
0 E& x0 `" `! e        #初始化球的半径* G5 j  K1 M! p" J3 k
        self.radius = randint(40, 70)
; Y, ~$ W0 k7 b7 g        #随机产生球的颜色0 @' Q* B8 c' y8 y1 t3 _) ~3 b
        rc = lambda :randint(0,255)* F* O2 F: B. H6 W) z
        self.color = '#%02x%02x%02x' % (rc(), rc(), rc())6 G. X. C3 ^4 d
; W8 H8 a: O. C' {: l
    def create_ball(self):
3 {1 h( p( m; Z1 B* }5 Q# y        #计算得到用于创建球的四个坐标
: ]7 t! y9 n% j- @2 P        x1 = self.x_pos - self.radius5 P6 T; n8 C6 b) m; E+ b
        y1 = self.x_pos - self.radius
+ v( C% T9 p* P% h        x2 = self.x_pos + self.radius# d2 ~: C0 ~( x* n0 r) o
        y2 = self.x_pos + self.radius
# [1 S; N- q1 i1 T% M6 Y  z4 {        #画球7 f: p- o! q( }9 j
        self.item = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color)% N4 }- x" B/ J7 K- U% u8 a
* x# G5 Y& p2 V. I
    def move_ball(self):. G2 b6 i5 c% C& O7 P% p( K
        '''按指定的距离移动球,如果球碰到障碍向相反的方向移动'''
+ Q+ ?( d" ^6 ^        self.x_pos += self.x_move
% U7 @8 T. k: \" X4 I. ^        self.y_pos += self.y_move
+ G% W  h5 b" y, Y; B7 ~5 G7 z1 D0 r7 Q  E- u2 G" ]1 ]- G8 n
        if self.x_pos >= self.scrnwidth - self.radius:) s, g! D9 w; W9 ^& o' O
            self.x_move = -self.x_move
, R& H! p' t& A' L        if self.y_pos >= self.scrnheight - self.radius:
. _& L% y# z6 p  L            self.y_move = -self.y_move0 ]! I/ b+ x: V/ K9 g
        if self.x_pos < self.radius:
2 E/ Q' X2 h9 {            self.x_move = abs(self.x_move)) E  j* Z/ @. J4 S0 B% V4 N
        if self.y_pos < self.radius:9 `6 J- m- f  Z1 Z
            self.y_move = abs(self.y_move)
5 q7 e5 T) ^6 m1 L7 M: A        self.canvas.move(self.item, self.x_move, self.y_move)0 Z7 p$ C( K( E0 \3 S# P: F9 M! K9 r
: @' J+ t: R( d+ ~' Y2 m
class Screensaver():
! s) i, C) v! i: d9 a0 f# v    balls = []
6 t% j- p. G. e    def __init__(self, ball_nums):; u+ ^. F4 s/ Q- I1 M9 A
        self.win = Tk()
% ^0 ^+ R" [0 U- h        self.width = self.win.winfo_screenwidth(). T" s) I9 Q; z* L  R
        self.height = self.win.winfo_screenheight()
% S- @2 J5 v8 a/ `        self.win.overrideredirect(True)
9 h9 Q4 G+ y" o) i" z, a        self.win.attributes('-alpha', 0.3)
0 }" ^1 e) J% l" `+ f8 E        #绑定事件,有任何动作退出屏保  I2 B; o8 g! H
        self.win.bind('<Any-Button>', self.exit_screensaver); e- h3 F- N6 w6 k, v3 \/ w+ {6 e" {
        self.win.bind('<Motion>', self.exit_screensaver)
4 e# X$ t$ o) W4 o1 G        self.canvas = Canvas(self.win, width=self.width, height=self.height, bg='#00FFFF')% H" h& J! o* n5 Y5 k
        self.canvas.pack()
3 c$ g! z7 T8 P( D# Z
+ i5 O1 V$ n2 e3 ^& i8 s0 J! K3 |        for i in range(0,ball_nums):
  t$ @0 n8 F7 J0 S            ball = Randball(self.canvas, scrnwidth=self.width, scrnheight=self.height)
2 t* r  M$ R. P( s( c/ J1 T. C' A            ball.create_ball()
; N$ x2 S/ c6 ^. }            self.balls.append(ball)
# |9 x. ^: \/ X; E  ]+ f. R8 g        self.run_screensaver()
) T  E5 B# {4 Y) k' j        self.win.mainloop()- u8 w# K" G. g: `6 v
0 K# I$ I5 n& t7 {7 x5 J" H
    def run_screensaver(self):8 k' M* [4 y& M5 E$ l
        for ball in self.balls:5 T8 Z; p0 N3 ~
            ball.move_ball()
$ Q8 k; `  o5 V$ @        self.canvas.after(20, self.run_screensaver)4 \9 @! P0 [9 {7 H5 r5 ^$ e
; K- u* e% [$ W
    def exit_screensaver(self, event):
# F6 a8 D9 L7 P8 K        self.win.destroy()
: z% I+ Q3 ^  o8 j  w" @# w+ c! l* {9 ^) n

$ m! b4 g' e( }' n  [def main():
, T/ ]3 d7 k0 i; l    Screensaver(15)
: F0 H' l5 k# Q2 t1 A% g* V/ s3 @- H1 D8 p  P

6 F1 B* Q9 N! q0 F( _+ |if __name__=='__main__':7 `: W  G, b2 [0 h- r
    main()
$ ~/ Z8 i2 n8 B1 f2 n; G2 c复制代码

该用户从未签到

2#
发表于 2016-6-1 16:29 | 只看该作者
9 @2 V. I. ~) k: C& j
学习了  挺好的资料  谢谢分享啊

该用户从未签到

3#
发表于 2016-6-2 15:29 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O
  • TA的每日心情
    奋斗
    2020-4-3 15:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2016-9-21 15:58 | 只看该作者
    牛逼,刚接触
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-23 19:42 , Processed in 0.156250 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表