国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python pygame(GUI編程)模塊最完整教程(2)

這篇具有很好參考價(jià)值的文章主要介紹了Python pygame(GUI編程)模塊最完整教程(2)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

上一篇文章:

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()
Python pygame(GUI編程)模塊最完整教程(2)
注意:字體渲染不是線程安全的。這意味著你無法用多線程渲染單個字體,同一時(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()
Python pygame(GUI編程)模塊最完整教程(2)

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)
Python pygame(GUI編程)模塊最完整教程(2)

這樣,字體長度達(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)
Python pygame(GUI編程)模塊最完整教程(2)

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()
Python pygame(GUI編程)模塊最完整教程(2)

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è)定,多個常量之間用按位或"|"操作符連接起來。

Python pygame(GUI編程)模塊最完整教程(2)

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。

Python pygame(GUI編程)模塊最完整教程(2)

Font.underline_adjustment -> float

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

Python pygame(GUI編程)模塊最完整教程(2)

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。

Python pygame(GUI編程)模塊最完整教程(2)

Font.rotation -> int

字體基線默認(rèn)的逆時(shí)針旋轉(zhuǎn)角度。

Font.fgcolor -> Color

字體前景色,默認(rèn)為黑色。

Font.bgcolor -> Color

字體背景色,默認(rèn)為透明色。

Python pygame(GUI編程)模塊最完整教程(2)

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,不同輸入法不一樣。
Python pygame(GUI編程)模塊最完整教程(2)

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)行效果:

Python pygame(GUI編程)模塊最完整教程(2)

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)行效果:

Python pygame(GUI編程)模塊最完整教程(2)

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)以下效果。

Python pygame(GUI編程)模塊最完整教程(2)

完整代碼


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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • python圖形界面化編程GUI(三)事件綁定(鼠標(biāo)和鍵盤、OptionMenu、scale、顏色、文件對話框、菜單和工具欄、ttk子模塊)

    python圖形界面化編程GUI(三)事件綁定(鼠標(biāo)和鍵盤、OptionMenu、scale、顏色、文件對話框、菜單和工具欄、ttk子模塊)

    Tkinter類 名稱 簡介 Toplevel 頂層 容器類,可用于為其他組件提供單獨(dú)的容器,類似于窗口 Button 按鈕 代表按鈕組件 Canvas 畫布 提供繪圖功能,包括直線、矩形、橢圓、多邊形、位圖等 Entry 單行輸入框 用戶可輸入內(nèi)容 Frame 容器 用于裝載其他GUI組件 Label 標(biāo)簽 用于顯示不可編輯

    2024年02月12日
    瀏覽(22)
  • pygame 繪制愛心函數(shù) r = 1-cos(θ). Tag: python | 圖形界面 | GUI

    pygame 繪制愛心函數(shù) r = 1-cos(θ). Tag: python | 圖形界面 | GUI

    最近做數(shù)學(xué)題,遇到一個“愛心函數(shù)” 即 r = 1 - cos(θ) . ——極坐標(biāo)下函數(shù)表達(dá)式 用參數(shù)方程表示即: x = (1 - cos(θ)) * cos(θ) y = (1 - cos(θ)) * sin(θ) 放個函數(shù)圖像 函數(shù)詳情點(diǎn)這里 代碼原理很簡單,采用極坐標(biāo)的方式,使用一個變量 t(即 θ ),每次循環(huán)自增(充當(dāng)計(jì)時(shí)器/角度

    2024年02月13日
    瀏覽(20)
  • Python GUI文章合集(PyQt5)

    Python GUI文章合集(PyQt5)

    我 的 個 人 主 頁:???? 失心瘋的個人主頁 ???? 入 門 教 程 推 薦 :???? Python零基礎(chǔ)入門教程合集 ???? 虛 擬 環(huán) 境 搭 建 :???? Python項(xiàng)目虛擬環(huán)境(超詳細(xì)講解) ???? PyQt5 系 列 教 程:???? Python GUI(PyQt5)文章合集 ???? Oracle數(shù)據(jù)庫教程:???? Oracle數(shù)據(jù)庫文章合

    2024年02月12日
    瀏覽(21)
  • 使用pip安裝Pygame模塊的教程

    Pygame是一個用于開發(fā)2D游戲的Python模塊,它提供了豐富的功能和工具,使得游戲開發(fā)變得簡單而有趣。在本教程中,我將向你介紹如何使用pip來安裝Pygame模塊,并提供相應(yīng)的源代碼示例。 步驟1:安裝Python和pip 在開始之前,確保你已經(jīng)安裝了Python和pip。你可以從Python官方網(wǎng)站

    2024年02月21日
    瀏覽(36)
  • PyQt5 GUI編程(QMainWindow與QWidget模塊結(jié)合使用)

    PyQt5 GUI編程(QMainWindow與QWidget模塊結(jié)合使用)

    QWidget是所有用戶界面對象的基類,而QMainWindow 用于創(chuàng)建主應(yīng)用程序窗口的類。它是 QWidget 的一個子類,提供了創(chuàng)建具有菜單欄、工具欄、狀態(tài)欄等的主窗口所需的功能。上篇主要介紹了基本使用,創(chuàng)建窗口時(shí)都是繼承單個模塊,本章主要介紹下兩個模塊的結(jié)合使用。 1.我們先

    2024年04月08日
    瀏覽(22)
  • Python GUI界面界面—tkinter,學(xué)習(xí)、復(fù)習(xí)、查閱,這一篇就夠了

    Python GUI界面界面—tkinter,學(xué)習(xí)、復(fù)習(xí)、查閱,這一篇就夠了

    ? ? ? ? PythonGUI程序界面設(shè)計(jì)tkinter優(yōu)點(diǎn):無需另外下載,是自帶的、操作簡單、易方便; ?????????????????????????????????????????????????????????缺點(diǎn):界面控件較少,頁面不夠美觀 注:一般來說做小軟件tkinter足夠了(頁面可以用ttkbootstrap美化

    2024年01月17日
    瀏覽(20)
  • python如何安裝pygame模塊

    python如何安裝pygame模塊

    游戲設(shè)計(jì)作品集,藝術(shù)留學(xué)申請條件/費(fèi)用/流程全面詳解查看詳情廣告 1 首先按鍵盤上的“Win + R”鍵。 游戲設(shè)計(jì)作品集,藝術(shù)留學(xué)申請_ACG國際藝術(shù)教育查看詳情廣告 2 在彈出的運(yùn)行窗口中輸入cmd,輸入完成后點(diǎn)擊確定。 3 然后在彈出的命令提示符窗口中輸入python,輸入完成后點(diǎn)

    2024年02月03日
    瀏覽(25)
  • python安裝pygame模塊可能問題解決

    python安裝pygame模塊可能問題解決

    一般我們添加python中模塊有兩種方法 1、 在開發(fā)軟件pycharm中文件中設(shè)置-項(xiàng)目 然后點(diǎn)擊加號,輸入自己要安裝的模塊,如pygame 但是我這種安裝存在可能安裝失敗,但是簡單 第二種就是用系統(tǒng)cmd命令進(jìn)行安裝 win+R打開cmd,先輸入pip install wheel安裝wheel工具,檢查pip是不是最新版

    2024年02月12日
    瀏覽(26)
  • python模塊: pygame(自己動手寫游戲)

    python模塊: pygame(自己動手寫游戲)

    目錄 一、pygame的安裝 ?二、pygame基礎(chǔ)操作 1.基本窗體設(shè)置 2.surface組件 ?3.event事件 一、pygame的安裝 在pycharm 左下角的終端上輸入指令pip install pygame,按下回車鍵執(zhí)行下載,推薦下載到虛擬環(huán)境上,即路徑前方帶有(venv)。或者不使用pycharm,在控制窗口輸入執(zhí)行該命令也可以(控

    2024年03月21日
    瀏覽(33)
  • 基于Python+Pygame實(shí)現(xiàn)一個俄羅斯方塊小游戲【完整代碼】

    基于Python+Pygame實(shí)現(xiàn)一個俄羅斯方塊小游戲【完整代碼】

    俄羅斯方塊,一款起源于上世紀(jì)80年代的經(jīng)典電子游戲,憑借簡單的規(guī)則和獨(dú)特的魅力,一躍成為全球家喻戶曉的經(jīng)典。你知道其實(shí)只需要一些基礎(chǔ)的編程知識,就可以自己實(shí)現(xiàn)它嗎?今天,我們將使用Python的Pygame庫,一步步帶你構(gòu)建屬于自己的俄羅斯方塊小游戲! 游戲初始

    2024年02月04日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包