序言
很多時候我們總是低估了自己风纠,對自己不夠狠,從而錯過了遇到一個更加優(yōu)秀的自己牢贸。逼自己一把竹观,很多事并不需要多高的智商,僅僅需要你的一份堅持十减,一個認(rèn)真的態(tài)度栈幸,一顆迎難而上的決心。
不去做帮辟,就永遠(yuǎn)不會有收獲速址;不相信,就永遠(yuǎn)不會有成功由驹;不可能芍锚,就永遠(yuǎn)停留現(xiàn)在。未來是靠把握機會和努力奮斗的蔓榄,相信永遠(yuǎn)比懷疑多一次成功的機會并炮!
-實戰(zhàn)
設(shè)計思路:
1、需要一個界面甥郑,這里選擇了使用 tkinter
2逃魄、需要一個畫布用于填充界面的顏色,并且界面窗口需要設(shè)置一定的透明度
3澜搅、根據(jù)每個電腦界面分辨率的不同伍俘, 需要獲取到整個界面的像素點
4、界面中需要繪制一些圖形用于展示及圖形需要在窗口界面中不斷的移動
5勉躺、如何設(shè)計程序退出癌瘾;這里通過綁定用戶的某個事件能夠使程序順利的退出
最終的效果演示
小球是來回運動的,碰到屏幕邊緣 就會回彈饵溅。
from random import randint
from tkinter import *
# 自定義 隨機球
class RandBall:
# 寬度 和 高度
def __init__(self, canvas, scrnwidth, scrnheight):
# 初始化畫布
self.canvas = canvas
# 初始化球的圓心坐標(biāo)
self.x_pos = randint(50, int(scrnwidth)) # X軸的坐標(biāo) randint 隨機產(chǎn)生一個范圍內(nèi)的整數(shù)
self.y_pos = randint(50, int(scrnheight)) # Y軸的坐標(biāo)
# 球的移動距離
self.scrnheight = scrnheight
# 初始化球的半徑
self.radius = randint(10, 80)
# 隨機產(chǎn)生球的顏色
rgb_color = lambda: randint(0, 255)
# #703a5d #f66865 #aad740
self.color = '#%02x%02x%02x' % (rgb_color(), rgb_color(), rgb_color())
# print(self.color)
def create_ball(self):
# 計算得到 用于創(chuàng)建球的四個坐標(biāo)
# x_pos :x軸圓心坐標(biāo) y_pos :y軸圓心坐標(biāo)
# 球的半徑
x1 = self.x_pos - self.radius
y1 = self.y_pos - self.radius
# 球的直徑
x2 = self.x_pos + self.radius
y2 = self.y_pos + self.radius
# 畫球 內(nèi)填充顏色 邊框顏色
self.oval = self.canvas.create_oval(x1, y1, x2, y2, fill=self.color, outline=self.color)
def move_ball(self):
# 球按照指定距離移動妨退,如果碰到障礙就向相反的方向運動
# x_move:球x軸和y軸的移動距離
self.x_pos += self.x_move
self.y_pos += self.y_move
# 判斷如果球的圓心坐標(biāo)>= 屏幕寬度 - 球的半徑
if self.x_pos >= self.scrnwidth - self.radius:
# 球就向相反的方向運動
self.x_move = -self.x_move
elif self.y_pos >= self.scrnheight - self.radius:
self.y_move = -self.y_move
elif self.x_pos < self.radius:
self.x_move = abs(self.x_move)
elif self.y_pos < self.radius:
self.y_move = abs(self.y_move)
self.canvas.move(self.oval, self.x_move, self.y_move)
# 屏幕保護程序,視屏閑置畫面
class ScreenSaver:
balls = []
# 傳遞的小球數(shù)量
def __init__(self, ball_nums):
# 創(chuàng)建窗口
self.win = Tk()
# 屏幕的分辨率是非常容易獲取到的,直接通過root.winfo_screenwidth()、root.winfo_screenheight()
self.width = self.win.winfo_screenwidth()
self.height = self.win.winfo_screenheight()
# 如果參數(shù)為True咬荷,該窗口忽略所有的小部件(
self.win.overrideredirect(True)
# 0.7窗口透明度30% , 0.4窗口透明度60% , 0.5窗口透明度50%
self.win.attributes('-alpha', 0.3)
# 綁定事件冠句,有任何動作退出屏保
self.win.bind('<Any-Button>', self.exit_screensaver)
# Motion事件表示當(dāng)鼠標(biāo)進入組件時,就會響應(yīng)這個事件
# 當(dāng)鼠標(biāo)在組件內(nèi)移動的時候觸發(fā)該事件
self.win.bind('<Motion>', self.exit_screensaver)
# 初始化畫布 并設(shè)置寬高 及背景顏色
self.canvas = Canvas(self.win, width=self.width, height=self.height,
bg="#00FFFF") # 背景 顏色自己隨便調(diào)整幸乒,至于啥顏色就看自己的心情了
self.canvas.pack()
# 循環(huán)遍歷 屏保小球個數(shù)
for i in range(0, ball_nums):
# 調(diào)用小球類
ball = RandBall(self.canvas, scrnwidth=self.width, scrnheight=self.height)
# 調(diào)用方法創(chuàng)建球
ball.create_ball()
# 添加
self.balls.append(ball)
# 運行
self.run_screensaver()
self.win.mainloop()
def run_screensaver(self):
# 遍歷 小球類對象
for ball in self.balls:
# 調(diào)用小球類 移動方法
ball.move_ball()
# 畫布
self.canvas.after(30, self.run_screensaver)
def exit_screensaver(self, event):
# 銷毀
self.win.destroy()
if __name__ == '__main__':
ScreenSaver(30) # 球的個數(shù)