python利用tkinter實(shí)現(xiàn)屏保
本文實(shí)例為大家分享了python利用tkinter實(shí)現(xiàn)屏保的具體代碼,供大家參考,具體內(nèi)容如下
import random
import tkinter
class RandomBall():
'''
運(yùn)動(dòng)的球
'''
def __init__(self, canvas, scrn_width,scrn_heigh):
'''
球的構(gòu)造函數(shù)
:param canvas: 傳入畫(huà)布,在畫(huà)布上進(jìn)行球的構(gòu)造
:param scrn_width: 傳入屏幕寬度
:param scrn_heigh: 傳入屏幕高度
'''
#x,y表示出現(xiàn)的球的圓心
self.ball_x = random.randint(20, int(scrn_width - 20)) #球出現(xiàn)的隨機(jī)x坐標(biāo)
self.ball_y = random.randint(10, int(scrn_heigh - 10)) #球出現(xiàn)的隨機(jī)y坐標(biāo)
#模擬運(yùn)動(dòng):就是不斷地重畫(huà)球,不斷地更新球的位置
self.x_move = random.randint(4, 30) #模擬x方向運(yùn)動(dòng)
self.y_move = random.randint(5, 20) #模擬y方向運(yùn)動(dòng)
#定義寬度和高度和畫(huà)布
self.canvas = canvas
self.scrn_width = scrn_width
self.scrn_heigh = scrn_heigh
#球的大小隨機(jī)
self.rad = random.randint(20, 150) #用半徑rad表示球的大小
#定義顏色
c = lambda : random.randint(0, 255)
self.color = "#%02x%02x%02x"%(c(), c(), c())
def creat_ball(self):
'''
用構(gòu)造函數(shù)中的值創(chuàng)建一個(gè)球
:return:
'''
#tkinter沒(méi)有畫(huà)圓函數(shù),只有橢圓函數(shù)
#但在正方形里面畫(huà)的橢圓就是正圓
#已知圓心坐標(biāo)和半徑,則圓心坐標(biāo)減半徑能求出正方形左上角
#圓心坐標(biāo)加上半徑,能求出右下角
#已知左上角和右上角,可以畫(huà)出
x1 = self.ball_x - self.rad #左上角的x坐標(biāo)
y1 = self.ball_y - self.rad #左上角的y坐標(biāo)
x2 = self.ball_x + self.rad #右下角的x坐標(biāo)
y2 = self.ball_y + self.rad #右下角的y坐標(biāo)
#在有對(duì)角坐標(biāo)的情況下就可以創(chuàng)建圓
self.item = self.canvas.create_oval(x1, y1, x2, y2, fill = self.color, outline = self.color)
# 球動(dòng)
def move_ball(self):
self.ball_x += self.x_move #球移動(dòng)后的新x坐標(biāo)
self.ball_y += self.y_move #球移動(dòng)后的新y坐標(biāo)
# 碰壁回彈判斷
if self.ball_x + self.rad >= self.scrn_width: #撞到了右邊的墻
self.x_move = -self.x_move
if self.ball_x - self.rad <= 0: #撞到了左邊的墻
self.x_move = -self.x_move
if self.ball_y + self.rad >= self.scrn_heigh: #撞到下面的墻
self.y_move = -self.y_move
if self.ball_y - self.rad <= 0: #撞到上面的墻
self.y_move = -self.y_move
self.canvas.move(self.item, self.x_move, self.y_move) #利用x,y的移動(dòng)距離控制球的移動(dòng)快慢
class ScreenSaver():
'''
可以被啟動(dòng)的屏保
'''
#創(chuàng)建一個(gè)list裝創(chuàng)建的球
def __init__(self):
self.balls = list()
self.nums_balls = random.randint(6, 20) #產(chǎn)生隨機(jī)數(shù)量的球
self.baseFrame = tkinter.Tk() #啟動(dòng)界面
self.baseFrame.overrideredirect(1) #取消邊框
#移動(dòng)鼠標(biāo)則退出屏保
self.baseFrame.bind("<Motion>", self.my_quit)
self.baseFrame.attributes('-alpha', 1)
#鍵盤(pán)任意鍵退出屏保
self.baseFrame.bind("<Key>",self.my_quit)
#得到屏幕的寬和高
w = self.baseFrame.winfo_screenwidth()
h = self.baseFrame.winfo_screenheight()
#創(chuàng)建畫(huà)布
self.canvas = tkinter.Canvas(self.baseFrame, width = w, height = h)
self.canvas.pack()
#在畫(huà)布上畫(huà)球
for i in range(self.nums_balls):
ball = RandomBall(self.canvas, scrn_width = w, scrn_heigh = h)
ball.creat_ball()
self.balls.append(ball)
self.run_screen_saver()
self.baseFrame.mainloop()
#球動(dòng)函數(shù)
def run_screen_saver(self):
for ball in self.balls:
ball.move_ball()
#在sleep100ms以后啟動(dòng)第二個(gè)參數(shù)函數(shù),相當(dāng)于100ms動(dòng)一次
self.canvas.after(100, self.run_screen_saver)
#當(dāng)事件發(fā)生時(shí),傳入event,退出屏保
def my_quit(self, event):
#析構(gòu)(退出)屏保
self.baseFrame.destroy()
if __name__ == "__main__":
#啟動(dòng)屏保
ScreenSaver()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
如何通過(guò)Flask的request對(duì)象獲取url
這篇文章主要介紹了如何通過(guò)Flask的request對(duì)象獲取url問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
詳解Python爬蟲(chóng)爬取博客園問(wèn)題列表所有的問(wèn)題
這篇文章主要介紹了詳解Python爬蟲(chóng)爬取博客園問(wèn)題列表所有的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
解決django同步數(shù)據(jù)庫(kù)的時(shí)候app models表沒(méi)有成功創(chuàng)建的問(wèn)題
今天小編就為大家分享一篇解決django同步數(shù)據(jù)庫(kù)的時(shí)候app models表沒(méi)有成功創(chuàng)建的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
基于Django集成CAS實(shí)現(xiàn)流程詳解
這篇文章主要介紹了基于Django集成CAS實(shí)現(xiàn)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Python詳細(xì)對(duì)比講解break和continue區(qū)別
這篇文章主要介紹了python循環(huán)控制語(yǔ)句 break 與 continue,break就像是終止按鍵,不管執(zhí)行到哪一步,只要遇到break,不管什么后續(xù)步驟,直接跳出當(dāng)前循環(huán)2022-06-06
Python?Asyncio庫(kù)之a(chǎn)syncio.task常用函數(shù)詳解
Asyncio在經(jīng)過(guò)一段時(shí)間的發(fā)展以及獲取Curio等第三方庫(kù)的經(jīng)驗(yàn)來(lái)提供更多的功能,目前高級(jí)功能也基本完善。本文主要介紹了Asyncio庫(kù)中asyncio.task常用函數(shù)的使用,需要的可以參考一下2023-03-03
Python中if?__name__==‘__main__‘用法詳情
這篇文章主要介紹了Python中if?__name__==‘__main__‘用法詳情,文章首先通過(guò)我們先定義一個(gè)test01.py的文件展開(kāi)詳情,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2022-06-06
Python 解決OPEN讀文件報(bào)錯(cuò) ,路徑以及r的問(wèn)題
今天小編就為大家分享一篇Python 解決OPEN讀文件報(bào)錯(cuò) ,路徑以及r的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

