上一篇文章:
Python pygame(GUI編程)模塊最完整教程(1)_pygame模塊詳解_Python-ZZY的博客-CSDN博客
總目錄:
README.md · Python-ZZY/Python-Pygame最完整教程 - Gitee.com
6 文字繪制
參考資料:pygame.font — pygame-ce v2.4.0 documentation
6.1 載入字體
pygame中繪制文字的第一步是載入字體。載入字體的方式通常有兩種,第一種是使用指定路徑的字體文件,第二種是從系統(tǒng)字體庫中載入字體。推薦第一種方式,因?yàn)樵谟螒虼虬?,你無法確定你電腦上安裝的字體文件在其他用戶的電腦上也安裝過。
pygame.font和pygame.freetype模塊提供了文字繪制的操作。font模塊功能比較簡單,freetype模塊是font模塊功能的擴(kuò)展。
Font類通過字體文件創(chuàng)建一個字體對象,支持包括*.ttf等一系列的TrueType字體。載入字體時(shí),需要提供一個字體文件路徑和字體大小。示例:
font = pg.font.Font("name_of_font.ttf", 12)
如果是調(diào)用系統(tǒng)字體文件,則使用SysFont。示例:
font = pg.font.SysFont("宋體", 12)
6.2 渲染字體
加載字體后,下一步是渲染字體。渲染字體調(diào)用字體對象的render()方法,將一段文字轉(zhuǎn)換成使用該字體的pygame.Surface對象。
render(text, antialias, color, bgcolor=None, wraplength=0) -> Surface
text是要渲染的一段文字內(nèi)容。
注意:pygame-ce 2.1.4版本之前不支持渲染換行符"\n"。
antialias是一個布爾值,代表是否使用抗鋸齒,抗鋸齒的文字更加平滑,但是速度會稍慢一點(diǎn)點(diǎn),一般選擇True。color是文字的顏色。background是文字背景顏色,設(shè)為None則為透明背景。
注意:如果文字繪制的位置始終是純色背景,那么最好是指定background背景顏色。因?yàn)槭褂眉兩畛浔仁褂猛该魈畛湫阅軙谩?
渲染后的字體可以當(dāng)做表面來處理。下面的示例顯示了如何繪制文字。
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 200))
font = pg.font.Font("simhei.ttf", 20) #大小為20的simhei字體文件(在同一目錄下)
surf = font.render("你好!這是一段文字", True, (255, 255, 255))
while True:
screen.fill((0, 0, 0))
screen.blit(surf, (0, 0))
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
pg.display.flip()

注意:字體渲染不是線程安全的。這意味著你無法用多線程渲染單個字體,同一時(shí)刻只能用該字體對象渲染一段文字。如果一定要用線程,可以建立多個Font對象,但每個對象都是一樣渲染結(jié)果。
6.3 字體特殊樣式
Font對象提供了幾個屬性獲取或改變字體的特殊樣式,包括加粗、斜體、下劃線、刪除線。
屬性 |
解釋 |
bold |
加粗 |
italic |
斜體 |
underline |
下劃線 |
strikethrough |
刪除線 |
例如想要讓字體加粗、斜體,可以這樣:
font.bold = font.italic = True
下面的示例演示了四種效果。
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 200))
surfs = []
font = pg.font.SysFont("simhei", 20)
surfs.append(font.render("default style", True, (255, 255, 255)))
for style in ("bold", "italic", "underline", "strikethrough"):
font = pg.font.SysFont("simhei", 20)
setattr(font, style, True)
surfs.append(font.render(style, True, (255, 255, 255)))
while True:
screen.fill((0, 0, 0))
for i, surf in enumerate(surfs):
screen.blit(surf, (0, i * 40))
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
pg.display.flip()

6.4 文本自動換行
注意:pygame-ce 2.3.0版本可用
render方法包含關(guān)鍵字參數(shù)wraplength,它指定一個像素長度,當(dāng)字體長度超過wraplength將自動換行(并且確保換行前后字母是一個完整的單詞)。
font = pg.font.SysFont("simhei", 20)
surf = font.render("This is a long long long long string.", True, (255, 255, 255), bgcolor=(255, 0, 0), wraplength=120)

這樣,字體長度達(dá)到120像素后會自動換行。
font還有一個可設(shè)定的屬性align,指定字體換行時(shí)統(tǒng)一靠向哪個地方??蛇x常量如下:
-
pg.FONT_LEFT:靠向左側(cè)(默認(rèn))
-
pg.FONT_CENTER:靠向中間
-
pg.FONT_RIGHT:靠向右側(cè)
font = pg.font.SysFont("simhei", 20)
font.align = pg.FONT_CENTER
surf = font.render("This is a long long long long string.", True, (255, 255, 255), (255, 0, 0), 120)

6.5 文本繪制方向
注意:pygame-ce 2.1.4版本可用
Font.set_direction方法設(shè)置文本的呈現(xiàn)方向,包含一個參數(shù)direction,可以設(shè)為如下常量值:
-
pg.DIRECTION_LTR:從左到右
-
pg.DIRECTION_RTL:從右到左
-
pg.DIRECTION_TTB:從上到下
-
pg.DIRECTION_BTT:從下到上
注意:從上到下和從下到上渲染時(shí),文本中換行符\n效果不佳
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 500))
surfs = []
font = pg.font.SysFont("simhei", 20)
for style in (pg.DIRECTION_LTR, pg.DIRECTION_RTL, pg.DIRECTION_TTB,
pg.DIRECTION_BTT):
font.set_direction(style)
surfs.append(font.render("HelloWorld!", True, (255, 255, 255), (255, 0, 0)))
while True:
screen.fill((0, 0, 0))
for i, surf in enumerate(surfs):
screen.blit(surf, (i * 40, i * 40))
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
pg.display.flip()

6.6 font模塊索引-字體操作
get_default_font() -> string
獲取pygame指定的默認(rèn)的字體名稱,一般是freesansbold.ttf。
get_fonts() -> list of strings
獲取系統(tǒng)上所有可用的字體名稱。
match_font(name, bold=False, italic=False) -> path
返回系統(tǒng)上名為name的字體的完整路徑。
SysFont(name, size, bold=False, italic=False) -> Font
從系統(tǒng)上調(diào)用字體,name為字體名,size為字體大小,bold和italic表示是否設(shè)為粗體或斜體。
Font(filename, size) -> Font
Font(pathlib.Path, size) -> Font
Font(object, size) -> Font
從文件載入字體。
Font.render(text, antialias, color, bgcolor=None, wraplength=0) -> Surface
通過字體渲染文字,text為文字內(nèi)容,antialias表示是否抗鋸齒,color是文字顏色,background為背景顏色(None為透明),wraplength為換行長度。
Font.size(text) -> (width, height)
返回渲染一段文字所需的表面大小。
Font.set_underline(bool) -> None
Font.get_underline() -> bool
設(shè)置和獲取文本的下劃線狀態(tài)。
Font.set_strikethrough(bool) -> None
Font.get_strikethrough() -> bool
設(shè)置和獲取文本的刪除線狀態(tài)。
Font.set_bold(bool) -> None
Font.get_bold() -> bool
設(shè)置和獲取文本的粗體狀態(tài)。
Font.set_italic(bool) -> None
Font.get_italic() -> bool
設(shè)置和獲取文本的斜體狀態(tài)。
Font.set_direction(direction) -> None
設(shè)置文本的呈現(xiàn)方向,direction可選常量值如下:
-
pg.DIRECTION_LTR:從左到右
-
pg.DIRECTION_RTL:從右到左
-
pg.DIRECTION_TTB:從上到下
-
pg.DIRECTION_BTT:從下到上
注意:從上到下和從下到上渲染時(shí),文本中換行符\n效果不佳
Font.metrics(text) -> list
返回一個列表,包含給定文本內(nèi)容中每個字符的信息。列表包含多個元組,每個元組中是每個字符的最小x偏移量、最大x偏移量、最小y偏移量、最大y偏移量、提前偏移量。無法識別的字符則為None。
Font.get_height() -> int
返回字體的平均高度。
Font.get_ascent() -> int
返回字體上升的高度,即從基線到字符頂端的高度。
Font.get_descent() -> int
返回字體下降的高度,即從基線到字符底部的高度。
6.7 freetype模塊索引-字體操作擴(kuò)展
參考資料:pygame.freetype — pygame-ce v2.4.0 documentation
freetype模塊是font模塊的擴(kuò)展,一般用font模塊就足夠了。
注意:freetype模塊沒有事先在pygame中導(dǎo)入,所以使用時(shí)不能直接調(diào)用pg.freetype,而要在開頭進(jìn)行導(dǎo)入:
from pygame import freetype
get_default_font() -> string
獲取pygame指定的默認(rèn)的字體名稱。
SysFont(name, size, bold=False, italic=False) -> Font
從系統(tǒng)上調(diào)用字體,name為字體名,size為字體大小,bold和italic表示是否設(shè)為粗體或斜體。
Font(file, size=0, font_index=0, resolution=0, ucs4=False) -> Font
Font(pathlib.Path) -> Font
從文件載入字體。size是字體的大小,設(shè)為0則使用默認(rèn)大小。font_index是字體位于某個字體文件中的索引。resolution是像素大小,用于縮放字形。
Font.name -> string
字體名稱。
Font.path -> string
字體文件路徑。
Font.size -> float
Font.size -> (float, float)
字體大小。
Font.ascender -> int
默認(rèn)大小狀態(tài)下字體上升高度。
Font.descender -> int
默認(rèn)大小狀態(tài)下字體下降高度。
Font.style -> int
字體默認(rèn)樣式。可以通過freetype模塊中定義的幾個常量(不是locals中的常量)來設(shè)定,多個常量之間用按位或"|"操作符連接起來。

Font.underline -> bool
字體默認(rèn)是否添加下劃線。
Font.strong -> bool
字體默認(rèn)是否加粗
Font.oblique -> bool
字體默認(rèn)是否傾斜。
Font.wide -> bool
字體默認(rèn)是否增寬(不支持旋轉(zhuǎn)后的字體)。
Font.strength -> float
字體strong或wide樣式中,字形被放大的量。默認(rèn)值約等于1/36。

Font.underline_adjustment -> float
字體下劃線的位置偏移,值的范圍是-2.0到2.0之間。默認(rèn)是1.0。設(shè)為0時(shí)下劃線位于文本基線處,設(shè)為負(fù)數(shù)為上劃線,設(shè)為正數(shù)為下劃線。

Font.fixed_sizes -> int
只讀屬性。字體是否固定寬度。
Font.fixed_sizes -> int
只讀屬性。字體包含位圖字符圖像的點(diǎn)大小的數(shù)量。
Font.scalable -> bool
只讀屬性。字體是否可伸縮。
Font.antialiased -> bool
字體是否抗鋸齒,默認(rèn)為True
Font.kerning -> bool
字體是否可調(diào)整字距,默認(rèn)為False。
Font.vertical -> bool
字體是否以垂直方向顯示,默認(rèn)為False。

Font.rotation -> int
字體基線默認(rèn)的逆時(shí)針旋轉(zhuǎn)角度。
Font.fgcolor -> Color
字體前景色,默認(rèn)為黑色。
Font.bgcolor -> Color
字體背景色,默認(rèn)為透明色。

Font.get_rect(text, style=STYLE_DEFAULT, rotation=0, size=0) -> rect
返回渲染text文字表面后的矩形對象。矩形對象的大小是表面的大小,位置(x, y)是文本原點(diǎn)的位置(也就是(0, 字體上升高度))。指定rotation將渲染的文字逆時(shí)針旋轉(zhuǎn),size改變字體的大小。
Font.get_metrics(text, size=0) -> [(...), ...]
返回一個列表,包含給定文本內(nèi)容中每個字符的信息。
Font.get_sized_ascender(<size>=0) -> int
根據(jù)字體大小獲取字體上升的高度。
Font.get_sized_descender(<size>=0) -> int
根據(jù)字體大小獲取字體下降的高度。
Font.get_sized_height(<size>=0) -> int
根據(jù)字體大小獲取字體的平均高度。
Font.get_sized_glyph_height(<size>=0) -> int
根據(jù)字體大小獲取字體包圍框的平均高度。(字體尺寸較小時(shí)和get_sized_height返回的結(jié)果近似)
Font.get_sizes() -> [(int, int, int, float, float), ...]
Font.get_sizes() -> []
返回嵌入式位圖的可用大小。
Font.render(text, fgcolor=None, bgcolor=None, style=STYLE_DEFAULT, rotation=0, size=0) -> (Surface, Rect)
渲染text文本。fgcolor, bgcolor分別表示前景和背景色,style是文本樣式,rotation是逆時(shí)針旋轉(zhuǎn)角度,size是文本的字體大小。Surface是渲染的文本表面,Rect是文本的大小,位于文字的原點(diǎn)。
text可以設(shè)為None,表示重新渲染上一次在get_rect(), render(), render_to(), render_raw(), or render_raw_to()這幾個方法調(diào)用過的文本。
Font.render_to(surf, dest, text, fgcolor=None, bgcolor=None, style=STYLE_DEFAULT, rotation=0, size=0) -> Rect
將render的運(yùn)行結(jié)果繪制到surf上,位于dest處。
Font.render_raw(text, style=STYLE_DEFAULT, rotation=0, size=0, invert=False) -> (bytes, (int, int))
將渲染的文字以8位灰度值形式返回,前景色為255,背景色為0。
Font.render_raw_to(array, text, dest=None, style=STYLE_DEFAULT, rotation=0, size=0, invert=False) -> Rect
將render_raw的運(yùn)行結(jié)果呈現(xiàn)到一個數(shù)組上(二維),位于dest處。
7 按鍵處理
參考資料:pygame.key — pygame-ce v2.4.0 documentation
pygame.key模塊提供了一些處理按鍵的操作。和鍵盤相關(guān)的event相比,key模塊支持了更多的功能,有時(shí)比事件更好用。
7.1 獲取持續(xù)按下的按鍵
pg.key.get_pressed方法返回一個字典,其中包含每個按鍵的按下情況。字典的鍵是按鍵的標(biāo)識符常量,是一個整數(shù);字典的值是一個布爾值,表示是否按下了這個按鍵。只有當(dāng)按鍵持續(xù)按下,并且沒有松開時(shí)才會設(shè)為True。
上一章的末尾“行走的人”示例中,關(guān)于玩家移動是使用event來做的。如果用event,就需要同時(shí)處理KEYDOWN和KEYUP事件,判斷按鍵按下且沒有松開。但如果使用pg.key.get_pressed,就可以減少麻煩,如下示例:
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 200))
clock = pg.time.Clock()
image = pg.image.load("logo.png")
image_rect = image.get_rect()
speed = 2
while True:
screen.fill((0, 0, 0))
screen.blit(image, image_rect)
keys = pg.key.get_pressed()
if keys[pg.K_UP]: #如果按下上方向鍵
image_rect.y -= speed
elif keys[pg.K_DOWN]:
image_rect.y += speed
if keys[pg.K_LEFT]:
image_rect.x -= speed
elif keys[pg.K_RIGHT]:
image_rect.x += speed
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
clock.tick(60)
pg.display.flip()
這樣可以很簡潔地實(shí)現(xiàn)持續(xù)移動。
7.2 獲取組合鍵
組合鍵是指按下多個按鍵。如果要對按下的多個按鍵進(jìn)行處理,可以用pg.key.get_mods()方法。
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 200))
while True:
mods = pg.key.get_mods()
if mods == pg.KMOD_NONE:
print("無組合鍵按下")
elif mods & pg.KMOD_CTRL:
print("按下了Ctrl和標(biāo)識符為", event.key, "的按鍵")
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
get_mods方法獲得的結(jié)果類似于event.mods,但是KEYDOWN或KEYUP只會在剛按下和剛松開按鍵時(shí)觸發(fā),而get_mods方法獲得的是持續(xù)按下不松開的按鍵內(nèi)容。沒有組合鍵按下時(shí)返回pg.KMOD_NONE相同的標(biāo)識符。
7.3 控制重復(fù)觸發(fā)KEYDOWN事件
pg.key.set_repeat方法可以控制KEYDOWN事件的頻率。比如持續(xù)按下某個按鍵時(shí),想要讓KEYDOWN事件每過一段時(shí)間就觸發(fā)一次,就可以用set_repeat方法。
set_repeat() -> None
set_repeat(delay) -> None
set_repeat(delay, interval) -> None
如果set_repeat不傳遞任何參數(shù),那么就是默認(rèn)的模式,只在按下時(shí)觸發(fā)一次KEYDOWN事件。如果指定了delay參數(shù),那么在按下按鍵后每經(jīng)過delay毫秒就重復(fù)觸發(fā)一次KEYDOWN事件。如果同時(shí)指定delay和interval參數(shù),那么就表示觸發(fā)一次KEYDOWN事件,等待delay毫秒后,再以interval毫秒的間隔重復(fù)觸發(fā)KEYDOWN事件。
舉例說明:
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 200))
pg.key.set_repeat(1000, 200)
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
elif event.type == pg.KEYDOWN:
print("KEYDOWN")
當(dāng)用戶按下某個按鍵時(shí),會先打印一次"KEYDOWN",然后等待1000ms,再以200ms的時(shí)間間隔觸發(fā)事件,打印多次"KEYDOWN",如果不能理解可以運(yùn)行代碼試一下。
這樣的停頓主要應(yīng)用于更改數(shù)值的計(jì)數(shù)器,當(dāng)點(diǎn)擊增加時(shí)數(shù)值+1,持續(xù)按下時(shí)數(shù)值增加的速度變快。
7.4 更改文本輸入候選框位置
前面介紹TEXTINPUT和TEXTEDITING的時(shí)候,已經(jīng)介紹過在pygame窗口上控制文本輸入的方法?,F(xiàn)在需要做的是改變文本輸入候選框的位置,而不是讓其固定在一處。
首先需要了解控制文本輸入的兩個函數(shù):
pg.key.start_text_input() -> None
pg.key.stop_text_input() -> None
這兩個函數(shù)分別表示開始文本輸入和停止文本輸入。
在默認(rèn)情況下是允許文本輸入的,所以一般不需要調(diào)用start_text_input。在調(diào)用stop_text_input函數(shù)后,TEXTINPUT和TEXTEDITING無法被接收到,文本候選框?qū)掷m(xù)被隱藏。重啟文本輸入功能可以再次調(diào)用start_text_input函數(shù)。
默認(rèn)情況下,文本候選框是無論輸入狀態(tài)如何都不被顯示的。需要顯示文本候選框,可以調(diào)用下面的代碼。
import os
os.environ["SDL_IME_SHOW_UI"] = "1" #顯示輸入候選框UI
這樣的話,當(dāng)處于允許輸入狀態(tài)下,輸入法的文本候選框會在輸入時(shí)顯示。注意要在pg.display.set_mode的前面調(diào)用以上代碼,否則無效。
注意:文本候選框是指類似于下圖的這樣一個窗口,即IME,不同輸入法不一樣。

set_text_input_rect()方法控制了輸入框的位置,它接受一個Rect對象表示文本候選框的位置(相對于pygame屏幕)。
pg.key.set_text_input_rect(Rect) -> None
示例如下:
import pygame as pg
import os
os.environ["SDL_IME_SHOW_UI"] = "1" #顯示輸入候選框UI
pg.init()
screen = pg.display.set_mode((300, 200))
font = pg.font.SysFont("simhei", 20)
text = ""
pg.key.set_text_input_rect((0, 0, 0, 0))
while True:
screen.fill((0, 0, 0))
screen.blit(font.render(text, True, (255, 255, 255)), (0, 0)) #繪制文字
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
elif event.type == pg.TEXTINPUT:
text += event.text
pg.key.set_text_input_rect((font.size(text)[0], 0, 0, 0))
elif event.type == pg.KEYDOWN:
if event.key == pg.K_BACKSPACE: #退格鍵
text = text[:-1]
pg.display.flip()
運(yùn)行效果:

7.5 key模塊索引-按鍵操作
get_focused() -> bool
判斷窗口是否獲取輸入焦點(diǎn)。
get_pressed() -> bools
以字典形式返回按下且沒有松開的按鍵。
get_mods() -> int
返回當(dāng)前按下且沒有松開的組合鍵。
set_repeat() -> None
set_repeat(delay) -> None
set_repeat(delay, interval) -> None
控制重復(fù)觸發(fā)KEYDOWN事件
get_repeat() -> (delay, interval)
獲取set_repeat設(shè)置的值。
name(key, use_compat=True) -> str
通過按鍵常量(鍵碼)返回鍵名,未找到則返回空字符串。
key_code(name=string) -> int
通過按鍵名返回按鍵常量,示例:
>>> pygame.key.key_code("return") == pygame.K_RETURN
True
>>> pygame.key.key_code("0") == pygame.K_0
True
>>> pygame.key.key_code("space") == pygame.K_SPACE
True
start_text_input() -> None
開始鍵盤輸入。
stop_text_input() -> None
結(jié)束鍵盤輸入。
set_text_input_rect(Rect) -> None
設(shè)置IME的位置。
8 鼠標(biāo)處理
參考資料:
pygame.mouse — pygame-ce v2.4.0 documentation
pygame.cursors — pygame-ce v2.4.0 documentation
8.1 獲取鼠標(biāo)位置
關(guān)于鼠標(biāo)操作,包括位置、鼠標(biāo)按鍵等一系列操作都位于pygame.mouse模塊。其中最常用的方法是pg.mouse.get_pos(),用于返回鼠標(biāo)相對于pygame屏幕的位置。鼠標(biāo)位于屏幕外時(shí),無法準(zhǔn)確獲取鼠標(biāo)位置。
注意:通過MOUSEMOTION事件也可以獲取鼠標(biāo)位置,但只有在鼠標(biāo)移動的時(shí)候才會觸發(fā)這個事件。
import pygame as pg
pg.init()
screen = pg.display.set_mode((300, 200))
font = pg.font.SysFont("simhei", 20)
text = ""
while True:
text = "鼠標(biāo)位置:" + str(pg.mouse.get_pos())
screen.fill((0, 0, 0))
screen.blit(font.render(text, True, (255, 255, 255)), (0, 0)) #繪制文字
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
pg.display.flip()
運(yùn)行效果:

8.2 隱藏和顯示光標(biāo)
set_visible方法設(shè)置鼠標(biāo)的可見性。當(dāng)設(shè)為False時(shí),光標(biāo)在屏幕內(nèi)時(shí)會隱藏不可見。
pg.mouse.set_visible(bool) -> bool
8.3 光標(biāo)樣式
光標(biāo)可以更改樣式,首先需要創(chuàng)建一個pg.cursor.Cursor光標(biāo)對象。
創(chuàng)建光標(biāo)對象的方式主要有這幾種:通過Surface對象、通過xbm文件、通過光標(biāo)字符串、通過光標(biāo)常量載入系統(tǒng)光標(biāo)。然后通過pg.mouse.set_cursor方法設(shè)置樣式。
先介紹載入系統(tǒng)光標(biāo)的方式。只需要將光標(biāo)樣式常量傳遞給set_cursor方法。pygame模塊中有以下用于光標(biāo)樣式的常量。
常量 |
樣式描述 |
SYSTEM_CURSOR_ARROW |
箭頭 |
SYSTEM_CURSOR_IBEAM |
提示光標(biāo)輸入的工形標(biāo) |
SYSTEM_CURSOR_WAIT |
等待 |
SYSTEM_CURSOR_CROSSHAIR |
十字形 |
SYSTEM_CURSOR_WAITARROW |
較小的等待箭頭 |
SYSTEM_CURSOR_SIZENWSE |
左上至右下的雙向箭頭 |
SYSTEM_CURSOR_SIZENESW |
左下至右上的雙向箭頭 |
SYSTEM_CURSOR_SIZEWE |
左右方向的雙向箭頭 |
SYSTEM_CURSOR_SIZENS |
上下方向的雙向箭頭 |
SYSTEM_CURSOR_SIZEALL |
四個方向的箭頭 |
SYSTEM_CURSOR_NO |
禁止的符號 |
SYSTEM_CURSOR_HAND |
手的形狀,提示點(diǎn)擊 |
例如:
pg.mouse.set_cursor(pg.SYSTEM_CURSOR_HAND)
還可以通過Surface對象設(shè)置光標(biāo)樣式,這樣就可以把某一張圖片設(shè)為光標(biāo)。所需的參數(shù)是光標(biāo)熱點(diǎn)的位置和表面對象。例如:
pg.mouse.set_cursor((0, 0), pg.image.load("cursor.png"))
8.4 mouse模塊索引-鼠標(biāo)操作
get_pressed(num_buttons=3) -> (button1, button2, button3)
get_pressed(num_buttons=5) -> (button1, button2, button3, button4, button5)
獲取各個鼠標(biāo)按鍵的按下狀態(tài)。默認(rèn)情況下只支持左鍵、中鍵、右鍵,也可以支持鼠標(biāo)側(cè)面兩個按鍵。
get_pos() -> (x, y)
獲取鼠標(biāo)位置,相對于pygame屏幕。
get_rel() -> (x, y)
獲取鼠標(biāo)位置,相對于于上一次鼠標(biāo)位置。
set_pos([x, y]) -> None
設(shè)置鼠標(biāo)位置。
set_visible(bool) -> bool
設(shè)置鼠標(biāo)可見性。
get_visible() -> bool
獲取鼠標(biāo)可見性。
get_focused() -> bool
判斷窗口是否在獲取鼠標(biāo)輸入。
set_cursor(pygame.cursors.Cursor) -> None
set_cursor(size, hotspot, xormasks, andmasks) -> None
set_cursor(hotspot, surface) -> None
set_cursor(constant) -> None
設(shè)置鼠標(biāo)樣式。
get_cursor() -> pygame.cursors.Cursor
獲取鼠標(biāo)樣式。
8.5 cursor模塊索引-光標(biāo)樣式
compile(strings, black='X', white='.', xor='o') -> data, mask
編譯光標(biāo)字符串。下面是一個光標(biāo)字符串的示例(箭頭光標(biāo))。
thickarrow_strings = ( #sized 24x24
"XX ",
"XXX ",
"XXXX ",
"XX.XX ",
"XX..XX ",
"XX...XX ",
"XX....XX ",
"XX.....XX ",
"XX......XX ",
"XX.......XX ",
"XX........XX ",
"XX........XXX ",
"XX......XXXXX ",
"XX.XXX..XX ",
"XXXX XX..XX ",
"XX XX..XX ",
" XX..XX ",
" XX..XX ",
" XX..XX ",
" XXXX ",
" XX ",
" ",
" ",
" ")
load_xbm(cursorfile) -> cursor_args
load_xbm(cursorfile, maskfile) -> cursor_args
加載xbm格式的位圖文件作為光標(biāo)。返回的cursor_args可以直接解包傳遞給set_cursor方法。
Cursor(size, hotspot, xormasks, andmasks) -> Cursor
Cursor(hotspot, surface) -> Cursor
Cursor(constant) -> Cursor
Cursor(Cursor) -> Cursor
Cursor() -> Cursor
光標(biāo)對象。
Cursor.type -> string
光標(biāo)類型,可能是"system", "bitmap", "color"
Cursor.data -> tuple
光標(biāo)數(shù)據(jù)
Cursor.copy() -> Cursor
復(fù)制光標(biāo)對象
實(shí)戰(zhàn):鍵盤輸入程序
本章是實(shí)戰(zhàn)練習(xí)環(huán)節(jié),將實(shí)現(xiàn)以下效果。文章來源:http://www.zghlxwxcb.cn/news/detail-444355.html

完整代碼
import pygame as pg
from pygame.locals import * #導(dǎo)入所有常量
import os
os.environ["SDL_IME_SHOW_UI"] = "1" #顯示輸入候選框UI
pg.init()
screen = pg.display.set_mode((300, 300), RESIZABLE) #窗口可調(diào)整大小
font = pg.font.SysFont("simhei", 20)
text = ""
index = 0
index_tip = ""
show_index = True
pg.key.set_repeat(750, 25) #持續(xù)觸發(fā)退格鍵
pg.key.set_text_input_rect((0, 0, 0, 0))
pg.mouse.set_cursor(SYSTEM_CURSOR_IBEAM)
pg.time.set_timer(USEREVENT, 500) #重復(fù)生成事件,光標(biāo)閃爍
def split_text(text): #將字符分行
res = [""]
for char in text:
if font.size(res[-1]+char)[0] > screen.get_width(): #get_width返回表面寬度
res.append("")
else:
res[-1] += char
return res
while True:
screen.fill((0, 0, 0))
s_list = split_text(text)
length = 0
for i, s in enumerate(s_list):
if length != -1:
length += len(s)
if length >= index - i:
index_line = i
idx = index - sum([len(s) for s in s_list[:i]])
s = s[:idx] + index_tip + s[idx:]
length = -1
pg.key.set_text_input_rect((font.size(s[:idx] + "|")[0], i *24, 0, 0))
screen.blit(font.render(s, True, (255, 255, 255)), (0, i * 24))
for event in pg.event.get():
if event.type == QUIT:
pg.quit()
elif event.type == WINDOWFOCUSLOST: #窗口失去焦點(diǎn),隱藏輸入光標(biāo)
show_index = False
elif event.type == WINDOWFOCUSGAINED: #窗口獲取焦點(diǎn),顯示輸入光標(biāo)
show_index = True
elif event.type == TEXTINPUT: #文本輸入
text = text[:index] + event.text + text[index:]
index += len(event.text)
elif event.type == KEYDOWN:
if event.key == K_BACKSPACE: #退格鍵
index -= 1
if index < 0:
index = 0
else:
text = text[:index] + text[index+1:]
elif event.key == K_DELETE: #向右刪除鍵
text = text[:index] + text[index+1:]
elif event.key == K_LEFT: #光標(biāo)向左
index -= 1
if index < 0:
index = 0
elif event.key == K_RIGHT: #光標(biāo)向右
index += 1
if index > len(s_list[index_line]):
index -= 1
elif event.type == USEREVENT: #更新光標(biāo)
if show_index:
index_tip = " " if index_tip != " " else "|"
else:
index_tip = "|"
pg.display.flip()
下一篇文章
Python pygame(GUI編程)模塊最完整教程(3)_pygame教程pdf_Python-ZZY的博客-CSDN博客文章來源地址http://www.zghlxwxcb.cn/news/detail-444355.html
到了這里,關(guān)于Python pygame(GUI編程)模塊最完整教程(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!