TKinter項(xiàng)目-屏保
TKinter項(xiàng)目實(shí)戰(zhàn)-屏保
項(xiàng)目分析
屏保可以自己啟動,也可以手動啟動
一旦敲擊鍵盤或者移動鼠標(biāo)后,或者其他的引發(fā)時(shí)間,則停止
如果屏保是一幅畫的話,則沒有畫框
圖像的動作是隨機(jī)的,具有隨機(jī)性,可能包括顏色,大小,多少, 運(yùn)動方向,變形等
整個(gè)世界的構(gòu)成是:
ScreenSaver:
需要一個(gè)canvas, 大小與屏幕一致,沒有邊框
Ball
顏色,大小,多少, 運(yùn)動方向,變形等隨機(jī)
球能動,可以被調(diào)用
import random import tkinter class RandomBall(): ''' 定義運(yùn)動的球的類 ''' def __init__(self, canvas, scrnwidth, scrnheight): ''' canvas: 畫布,所有的內(nèi)容都應(yīng)該在畫布上呈現(xiàn)出來,此處通過此變量傳入 scrnwidth/scrnheigh:屏幕寬高 ''' self.canvas = canvas # 球出現(xiàn)的初始位置要隨機(jī),此處位置表示的球的圓心 # xpos表示位置的x坐標(biāo) self.xpos = random.randint(10, int(scrnwidth)-50) # ypos表示位置的y坐標(biāo) self.ypos = random.randint(10, int(scrnheight)-50) # 定義球運(yùn)動的速度 # 模擬運(yùn)動:不斷的擦掉原來畫,然后在一個(gè)新的地方再從新繪制 # 此處xvelocity模擬x軸方向運(yùn)動 self.xvelocity = random.randint(4, 20) # 同理,yvelocity模擬的是y軸方向運(yùn)動 self.yvelocity = random.randint(4, 20) # 定義屏幕的大小 self.scrnwidth = scrnwidth # 定義屏幕的高度 self.scrnheight = scrnheight # 球的大小隨機(jī) # 此處球的大小用半徑表示 self.radius = random.randint(20, 120) # 定義顏色 # RGB表示法:三個(gè)數(shù)字,每個(gè)數(shù)字的值是0-255之間,表示紅綠藍(lán)三個(gè)顏色的大小 # 在某些系統(tǒng)中,之間用英文單詞表示也可以,比如red, green # 此處用lambda表達(dá)式 c = lambda: random.randint(0,255) self.color ='#%02x%02x%02x'%(c(), c(), c()) def create_ball(self): ''' 用構(gòu)造函數(shù)定義的變量值,在canvas上畫一個(gè)球 ''' #tkinter沒有畫圓形函數(shù) # 只有一個(gè)畫橢圓函數(shù),畫橢圓需要定義兩個(gè)坐標(biāo), # 在一個(gè)長方形內(nèi)畫橢圓,我們只需要定義長方形左上角和右下角就好 # 求兩個(gè)坐標(biāo)的方法是,已知圓心的坐標(biāo),則圓心坐標(biāo)減去半徑能求出 #左上角坐標(biāo),加上半徑能求出右下角坐標(biāo) x1 = self.xpos - self.radius y1 = self.ypos - self.radius x2 = self.xpos + self.radius y2 = self.ypos + self.radius # 再有兩個(gè)對角坐標(biāo)的前提下,可以進(jìn)行畫圓 # fill表示填充顏色 # outline是外圍邊框顏色 self.item = self.canvas.create_oval(x1, y1, x2, y2, \ fill=self.color, \ outline=self.color) def move_ball(self): # 移動球的時(shí)候,需要控制球的方向 # 每次移動后,球都有一個(gè)新的坐標(biāo) self.xpos += self.xvelocity # 同理計(jì)算ypos self.ypos += self.yvelocity # 以下判斷是會否撞墻 # 撞了南墻就要回頭 # 注意撞墻的算法判斷 if self.xpos + self.radius >= self.scrnwidth or self.xpos <= self.radius: # 裝到了左邊或者右邊墻 self.xvelocity = -self.xvelocity # 或者以下代碼 # self.xvelocity *= -1 # 同理可以判斷撞別的墻的算法 if self.ypos + self.radius >= self.scrnheight or self.ypos <= self.radius: # 撞到了上邊或者下邊墻 self.yvelocity = -self.yvelocity # 在畫布上挪動圖畫 self.canvas.move(self.item, self.xvelocity, self.yvelocity) class ScreenSaver(): ''' 定義屏保的類 可以被啟動 ''' # 如何裝隨機(jī)產(chǎn)生的球? balls = list() def __init__(self): # 每次啟動球的數(shù)量隨機(jī) self.num_balls = random.randint(6, 20) self.root = tkinter.Tk() # 取消邊框 self.root.overrideredirect(1) # 任何鼠標(biāo)移動都需要取消 self.root.bind('
import tkinter help(tkinter.Tk.overrideredirect)
Help on function wm_overrideredirect in module tkinter: wm_overrideredirect(self, boolean=None) Instruct the window manager to ignore this widget if BOOLEAN is given with 1. Return the current value if None is given.
Canvas Python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。