TKinter項(xiàng)目-屏保

      網(wǎng)友投稿 802 2022-05-28

      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('', self.myquit) # 同理,按動任何鍵盤都需要退出屏保 #得到屏幕大小規(guī)格 w,h = self.root.winfo_screenwidth(), self.root.winfo_screenheight() #創(chuàng)建畫布,包括畫布的歸屬,規(guī)格 self.canvas = tkinter.Canvas(self.root, width=w, height=h) self.canvas.pack() # 在畫布上畫球 for i in range(self.num_balls): ball = RandomBall(self.canvas, scrnwidth=w, scrnheight=h) ball.create_ball() self.balls.append(ball) self.run_screen_saver() self.root.mainloop() def run_screen_saver(self): for ball in self.balls: ball.move_ball() # after是200毫秒后啟動一個(gè)函數(shù),需要啟動的函數(shù)是第二個(gè)參數(shù) self.canvas.after(200, self.run_screen_saver) def myquit(self, e): # 此處只是利用了事件處理機(jī)制 # 實(shí)際上并不關(guān)心事件的類型 self.root.destroy() if __name__ == "__main__": # 啟動屏保 ScreenSaver()

      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)容。

      上一篇:計(jì)算機(jī)組成的基本硬件設(shè)備
      下一篇:Python技能樹每日一練——文件操作
      相關(guān)文章
      亚洲精品天堂成人片AV在线播放| 亚洲w码欧洲s码免费| 亚洲精品无码久久久久秋霞 | 亚洲三级电影网址| 日本亚洲欧洲免费天堂午夜看片女人员 | 亚洲日本国产综合高清| 亚洲制服在线观看| 亚洲女人影院想要爱| 亚洲视频在线观看网址| 亚洲短视频男人的影院| 亚洲成人在线电影| 亚洲综合精品香蕉久久网97| 337p日本欧洲亚洲大胆艺术| 亚洲黄色一级毛片| 亚洲成人一级电影| 亚洲无吗在线视频| 亚洲人成网站色7799| 亚洲成av人片在线天堂无| 亚洲av午夜国产精品无码中文字 | 亚洲中文精品久久久久久不卡| 亚洲伊人久久大香线蕉AV| 亚洲人成网亚洲欧洲无码| 亚洲国产欧洲综合997久久| 色欲色欲天天天www亚洲伊| 久久精品国产亚洲av瑜伽| 亚洲高清无码综合性爱视频| 亚洲视频在线免费| 国产亚洲?V无码?V男人的天堂| 亚洲桃色AV无码| 亚洲国产综合精品中文第一区| 久久亚洲AV无码精品色午夜| 亚洲人成毛片线播放| 亚洲自国产拍揄拍| 亚洲高清国产拍精品熟女| 国产精品亚洲а∨天堂2021| 国产福利电影一区二区三区,亚洲国模精品一区 | 亚洲精品专区在线观看| 亚洲精品无码久久千人斩| 亚洲成a人片在线观看中文动漫| 伊人久久综在合线亚洲2019| 亚洲一区在线视频|