
來源:Python爬蟲與數(shù)據(jù)挖掘
作者:Python進(jìn)階者
為什么我不選擇pygame,原因很簡(jiǎn)單,因?yàn)閜yglet 更簡(jiǎn)單,比較輕量級(jí),就好比django和flask的區(qū)別。
相信你在讀了這篇文章之后也會(huì)毅然決然的選擇pyglet。
這篇文章主要圍繞pyglet 的安裝、基本用法和實(shí)例三部分進(jìn)行展開。
和大多數(shù)模塊安裝方式一樣,pyglet 的安裝方式如下:
pip install py
#導(dǎo)入模塊 import pyglet
下面我們來看看這個(gè)模塊中具體有哪些方法,那么怎么看呢?我們都知道,要查看系統(tǒng)中所有模塊的話,可以使用
pip list
還有一種比較Python的方法:
import sys print(sys.modules.keys())
恩,但是今天我們要查看的是pyglet的所有方法,所以,dir了解下,用這個(gè)內(nèi)置函數(shù):
print(dir(pyglet))
我們先不看那些帶下劃線的方法,因?yàn)槟切┓椒ǘ际谴罄性谘芯康姆较?,我們先看比較平民化的方法,比如說第一個(gè)app,image,clock,media,os,sys,text,version,window,input,lib,font,event,是不是一看就能知道它是干啥的?什么,你不知道?那只能說明你英語太差了。比如說我想獲取它的版本號(hào),那么version肯定是首選了,下面來試試:
結(jié)果和我們料想的一樣,真的是太有才了。既然我們是要用這個(gè)來編寫游戲,那么肯定少不了窗口了。
既然談到窗口,那咱們第一印象肯定是window啦,因?yàn)樗陀写翱诘囊馑肌?
我們可以看到它并未顯示窗口,說明少了點(diǎn)東西,查看官方文檔可知,而且它的參數(shù)貌似還不少:
這是我從它的源代碼文檔中所得的??梢钥闯龆际瞧匠N覀円姷帽容^多的英文。這些參數(shù)的說明如下:
width:寬度
height:高度
caption:標(biāo)題 resizable:是否可以調(diào)整大小 style:風(fēng)格 fullscreen:是否全屏 visible:是否可見 vsync:暫不清楚 file_drops:文件刪除 display:指定的設(shè)備 screen:屏幕 config:配置 context:上下文處理器 mode:模式
雖然參數(shù)很多,但是并不是每個(gè)都能用到。下面我們就簡(jiǎn)單創(chuàng)建個(gè)窗口吧。
pyglet.window.Window(600, 600) #創(chuàng)建一個(gè)600*600的窗口 pyglet.app.run() #啟動(dòng) ,有點(diǎn)像flask的啟動(dòng)方式
這樣就成功啟動(dòng)了一個(gè)窗口。
其實(shí)窗口里面還有很多方法,有在用自動(dòng)提示功能IDE的老鐵應(yīng)該不陌生:
win.get_location() win.set_location(x,y) win.get_size() win.width win.height
想必大家應(yīng)該比較熟悉了。
但是這也遠(yuǎn)遠(yuǎn)不夠啊,我們還得給它點(diǎn)修飾,比如說加點(diǎn)文字圖片什么的。
1、加文字
為了顯示文本,我們得使用text方法,text方法又有很多子方法,因?yàn)橐砑游谋舅韵纫幸粋€(gè)標(biāo)簽,所以我們先要加個(gè)label方法,下面看看label有哪些方法:
可以看出,的確又是一大堆,下面請(qǐng)看參數(shù)說明:
text:文本 font_name:字體名 font_size:字體大小 bold:是否加粗 italic:是否傾斜 color:字體顏色 x:文本左下角x坐標(biāo) y:文本左下角y坐標(biāo) width:文本寬度 height:文本高度 anchor_x:x坐標(biāo)錨點(diǎn),可以分為:left center right anchor_y:y坐標(biāo)錨點(diǎn),可以分為:bottom baseline center top align:水平方向位置 multiline:是否換行,如果是,需指定寬度 dpi:鼠標(biāo)每移動(dòng)一英寸指針在屏幕上移動(dòng)的點(diǎn)數(shù) batch:批量處理 group:組
接下來我們需要?jiǎng)?chuàng)建一個(gè)label:
label = pyglet.text.Label('fuck you',
font_size=40,
x=win.width//2, y=win.height//2, #窗口寬高的一半 anchor_x='center', anchor_y='center') #中間位置
然后繪制文本:
label.draw()
但是這樣并不能將文字加入到窗口中,因?yàn)橹暗拇翱跊]有清除,窗口重繪其實(shí)就是一個(gè)清除在添加在清除的過程,因?yàn)榇翱趧?chuàng)建時(shí)啟用了一個(gè)on_draw方法,所以這時(shí)我們需要重寫on_draw方法。
@win.event #裝飾器 def on_draw():#重寫on_draw方法 win.clear() #窗口清除 label.draw() #重繪窗口
這樣窗口就達(dá)到最新的效果,就有了文字,然后在啟動(dòng):
pyglet.app.run()
2、添加圖片
關(guān)于圖片的話,想必里面的image大家應(yīng)該比較熟悉。
那么我們先將圖片讀取出來,然后進(jìn)行重繪
import pyglet
win=pyglet.window.Window(600, 600)
image=pyglet.image.load('2.jpg') #讀取圖片 @win.event def on_draw(): #重寫方法 win.clear() #窗口清除 image.blit(0, 0) #重繪窗口,從左下角的(0,0)處開始繪制 pyglet.app.run() #啟動(dòng)
這里要說到的一個(gè)非常重要的參數(shù)便是blit了,它和顯示文字的draw一樣,要想圖片顯示在屏幕上還得靠它。
當(dāng)然,官方文檔顯示還有一種方法:
import pyglet
win = pyglet.window.Window()
image = pyglet.resource.image('2.jpg') #讀取資源文件 @win.event def on_draw(): win.clear()
image.blit(0, 0)
pyglet.app.run()
這樣也可以,兩種方法任選一種,你喜歡就好。
對(duì)于加載不同文件夾下的圖片,有什么好的策略了:
pyglet.resource.path = ['./images'] #先導(dǎo)入圖片路徑但是路徑必須和程序在同一個(gè)目錄 pyglet.resource.reindex() #建立索引 image = pyglet.resource.image("1.jpg") #加載圖片 image.get_region(x, y, width, height) #得到新圖片
也可以使用image.load()
from pyglet import image
picture = image.load('picture.png') #讀取圖片 #你可以截圖這張圖片,生成張新的圖片。 picture.get_region(x, y, width, height)
目前我們僅僅只接觸到了on_draw 這一個(gè)事件,那么pyglet還有哪些有趣的鍵盤和鼠標(biāo)處理事件呢?我們一起看下吧。
3、鍵盤事件
用法:
def on_key_press(symbol, modifiers): #鍵盤按下 pass def on_key_release(symbol, modifiers):#鍵盤釋放 pass
1) 常用symbol
按鍵符號(hào):
key.A #字母 key._1 #數(shù)字
#控制鍵 key.ENTER or key.RETURN key.SPACE key.BACKSPACE key.DELETE key.MINUS key.EQUAL key.BACKSLASH #小鍵盤 key.NUM_1 key.NUM_2 key.NUM_EQUAL key.NUM_DIVIDE key.NUM_MULTIPLY key.NUM_SUBTRACT key.NUM_ADD key.NUM_DECIMAL key.NUM_ENTER #左右修飾鍵 key.LCTRL key.RCTRL key.LSHIFT key.RSHIFT
判斷按下哪個(gè)鍵:
import pyglet from pyglet.window import key
win=pyglet.window.Window(500,400) @win.event def on_key_press(symbol, modifiers):
if symbol == key.W:
print('前進(jìn)')
elif symbol == key.S:
print('后退')
elif symbol == key.A:
print('左移')
elif symbol == key.D:
print('右移')
if modifiers & key.MOD_CTRL:
print('over')
pyglet.app.run()
可以看到結(jié)果如我們所料:
這樣大家是不是就有種想寫游戲的沖動(dòng)了了。
當(dāng)然,pyglet還能將當(dāng)前鍵盤狀態(tài)進(jìn)行存儲(chǔ)以便隨時(shí)調(diào)用,可用KeyStateHandler()實(shí)現(xiàn)。
import pyglet from pyglet.window import key
win=pyglet.window.Window(500,400)
kd = key.KeyStateHandler() #初始化 win.push_handlers(kd) #將鍵狀態(tài)裝進(jìn)窗口記錄 有裝當(dāng)然就有扔:pop if kd[key.SPACE]:
print('按下了空格鍵')
4、鼠標(biāo)事件
def on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動(dòng) pass def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住 pass def on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放 pass def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動(dòng) pass def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口 pass def on_mouse_leave(x, y): #鼠標(biāo)離開窗口 pass def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪 pass
我們可以實(shí)現(xiàn)下它的部分有趣功能:
import pyglet
win=pyglet.window.Window(500,400) @win.event def on_mouse_motion(x,y,dx,dy):#鼠標(biāo)移動(dòng) print('移動(dòng)') @win.event def on_mouse_press(x, y, button, modifiers): #鼠標(biāo)按住 print('按下鼠標(biāo)') @win.event def on_mouse_release(x, y, button, modifiers):#鼠標(biāo)釋放 print('松開鼠標(biāo)') @win.event def on_mouse_drag(x, y, dx, dy, buttons, modifiers):#鼠標(biāo)拖動(dòng) print('拖動(dòng)鼠標(biāo)') @win.event def on_mouse_enter(x, y): #鼠標(biāo)進(jìn)入窗口 print('進(jìn)入窗口') @win.event def on_mouse_leave(x, y): #鼠標(biāo)離開窗口 print('離開窗口') @win.event def on_mouse_scroll(x, y, scroll_x, scroll_y):#鼠標(biāo)滾輪 print('鼠標(biāo)滾輪')
pyglet.app.run()
可以看到,我們成功捕獲到鼠標(biāo)的運(yùn)行軌跡。
鼠標(biāo)常數(shù):
這個(gè)可以用來判斷到底是哪邊的鼠標(biāo)按鍵被觸發(fā)了。
pyglet.window.mouse.LEFT #左邊 pyglet.window.mouse.MIDDLE #中間滾輪 pyglet.window.mouse.RIGHT #右邊
改變鼠標(biāo)光標(biāo):
win.set_mouse_visible(visible=True) #顯示 False隱藏 cursor = win.get_system_mouse_cursor(win.CURSOR_HELP) #獲取操作系統(tǒng)定義的游標(biāo) win.set_mouse_cursor(cursor) #設(shè)置鼠標(biāo)外觀
也可以使用自定義圖像作為光標(biāo):
image = pyglet.image.load('2.jpg') #讀取圖片 cursor = pyglet.window.ImageMouseCursor(image, 16, 8) #將圖片添加到鼠標(biāo)游標(biāo)上 win.set_mouse_cursor(cursor) #設(shè)置鼠標(biāo)游標(biāo) win.set_mouse_visible(visible=True) #設(shè)置可見
激活鼠標(biāo)獨(dú)占模式:
win.set_exclusive_mouse(True)#射擊游戲常
用于游戲時(shí)輸入某些命令可以更改某些參數(shù),值,達(dá)到一定的效果。
import pyglet
win=pyglet.window.Window(500,400) @win.event def on_text(text): #輸入文本事件 if text=='i love you':
print('i love you too')
1.重設(shè)大小
用法:on_resize(width,height)
win=pyglet.window.Window(500,400) @window.event def on_resize(width,height): width=100 height=200 pyglet.app.run()
我們都知道,如果每個(gè)都去這樣設(shè)置,費(fèi)時(shí)費(fèi)力,而且也不簡(jiǎn)潔,我們可以用一個(gè)類封裝:
import pyglet
from pyglet.window import key
win=pyglet.window.Window(500,400) class win(pyglet.window.Window): #繼承Window類 def on_resize(self,width,height): #重寫方法 self.width=200 #重設(shè)寬度 self.height=100 #重設(shè)高度 def on_text(self,text): #文本事件 aa=input('shuru:')
if aa=='I love you':
print('i love you too')
def on_key_press(self,symbol, modifiers): #監(jiān)聽鍵盤事件 if symbol == key.W: print('前進(jìn)')
self.width=self.width+100 elif symbol == key.S: print('后退')
self.width=self.width+200 elif symbol == key.A: print('左移')
self.width=self.width-200 elif symbol == key.D: print('右移')
self.width=self.width-100 if modifiers & key.MOD_CTRL: print('over')
self.width=self.width+300 win()
pyglet.app.run()
有點(diǎn)卡頓,不過問題不大,最重要的是我們把它實(shí)現(xiàn)了。
pyglet不光可以制作游戲,它還可以播放音樂,那么它是怎么實(shí)現(xiàn)的呢?
1.使用media.load播放音頻
import pyglet
win=pyglet.window.Window()
sound = pyglet.media.load('11.wav', streaming=False) #加載音樂,注意只能播放wav格式音頻 sound.play() #播放 pyglet.app.run()
2.使用resource.media播放音頻
import pyglet
win=pyglet.window.Window()
sound = pyglet.resource.media('11.wav', streaming=False) #加載音樂,注意只能播放wav格式音頻 sound.play() #播放 pyglet.app.run()
兩種方法均可,其實(shí)在大部分加載操作中,都可以用到這兩種方法,比如說media /image/text都可以。
如果我們需要控制播放,則需引入另一個(gè)方法:Player(),注意第一個(gè)是大寫。
play = pyglet.media.Player()
然后我們將播放音頻添加到一個(gè)隊(duì)列中去:
play.queue(sound)
最后播放:
play.play()
通過上面的講述我們現(xiàn)在就可以添加多首音樂到我們的隊(duì)列中了。下面請(qǐng)看:
import pyglet
win=pyglet.window.Window()
sound = pyglet.resource.media('11.wav', streaming=False)
sound1=pyglet.media.load('2.wav', streaming=False)
play = pyglet.media.Player()
play.queue(sound) #隊(duì)列一 play.queue(sound1)#隊(duì)列二 play.play()#播放 win.close() #隱藏黑窗口,可以惡搞別人 pyglet.app.run()
有時(shí)候我們想讓這些音頻循環(huán)播放那又該怎么辦呢?其實(shí),只需加一個(gè)循環(huán)即可。
import pyglet
win=pyglet.window.Window()
sound = pyglet.resource.media('11.wav', streaming=False)
sound1=pyglet.media.load('2.wav', streaming=False)
play = pyglet.media.Player() def xh(): while 1: #條件為真的循環(huán) yield sound #不斷的迭代 yield sound1
play.queue(xh()) #添加到隊(duì)列 play.play() #播放 pyglet.app.run() #啟動(dòng)
無所不能的pyglet,游戲 音頻視頻全能啊,哈哈哈。
播放視頻的方法跟音頻比較相似,但也有很多不同的地方。同樣也是兩種方法:
1.使用media.load播放視頻
import pyglet
win=pyglet.window.Window()
video = pyglet.media.load('12.mp4') #加載視頻,注意沒有streaming參數(shù) play=pyglet.media.Player() #創(chuàng)建播放器對(duì)象 play.queue(video) #添加任務(wù)隊(duì)列 play.play() #播放 @win.event def on_draw(): win.clear()
play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置,也可使用play.texture.blit(30,60) pyglet.app.run()
2.使用resource.media播放視頻
import pyglet
win=pyglet.window.Window()
video = pyglet.resource.media('12.mp4') #加載視頻,注意沒有streaming參數(shù) play=pyglet.media.Player() #創(chuàng)建播放器對(duì)象 play.queue(video) #添加任務(wù)隊(duì)列 play.play() #播放 @win.event def on_draw(): win.clear()
play.get_texture().blit(30,60) #設(shè)置視頻在黑窗口中的位置 pyglet.app.run()
pyglet 還有很多好玩的例子,比如canvas畫圖,不過相比較我說的幾點(diǎn),還是會(huì)顯得比較無趣些,希望以上的內(nèi)容能幫助你快速開發(fā)一個(gè)實(shí)用型應(yīng)用程序。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場(chǎng)景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡(jiǎn)單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10