URLhttps://learnscript.net/zh-hant/pygame/x/xbutton/
    複製連結移至說明  範例

    快捷實用按鈕模組 xbutton 使用說明

    閱讀 16:58·字數 5093·發佈 
    Youtube 頻道
    訂閱 480

    購買 xbutton.py - 最低 1.99 元(驚爆價)

    前言

    在使用 Pygame 開發遊戲時,按鈕是最常見的互動控製項之一。xbutton是一個簡單易用的按鈕模組。通過他,你可以輕松實作按鈕的多狀態樣式、事件繫結、鍵盤與手把控製。

    匯入 xbutton 相關類別

    在模組xbutton對應的檔案xbutton.py中,包含了按鈕物件XButton和樣式物件XStyle,需要匯入他們。

    create.py
    from xbutton import XButton, XStyle

    樣式類別 XStyle

    XStyle物件用於定義一種外觀,包括背景,字型等,可在建立XButton時使用。

    XStyle(image=None, size=None, font=None, font_style=None, text_color=None, text_offset=None, scale=None)

    image 參數

    image表示背景影像的Surface物件,或影像檔案路徑,或包含影像資訊的IO物件。如果采用檔案路徑,那麽不必擔心會產生重複的Surface物件,XStyle會優先采用快取。

    size 參數

    size表示控製項的大小,如果忽略,則嘗試根據背景影像的大小產生。

    font 參數

    font表示繪製文字所需的freetype.Font字型物件,或一個包含字型檔案路徑和字型大小的元組。如果忽略,則采用DEFAULT_FONT表示的字型物件。如果采用相同的字型檔案路徑和大小,那麽不必擔心會產生重複的Font物件,XStyle會優先采用快取。

    font_style 參數

    font_style表示繪製文字時,所采用的字型樣式,如果忽略,則采用freetype.STYLE_DEFAULT

    text_color 參數

    text_colorColor類別的建構子的rgbvalue參數相同,用於建立色彩物件,來繪製文字。如果忽略,則采用DEFAULT_COLOR表示的色彩物件。

    text_offset 參數

    text_offset表示文字的位移距離,當背景影像展現位移效果時,可設定該參數來調整文字的位置。

    scale 參數

    scale表示縮放大小(可能導致模糊),大於1為放大,小於1為縮小,將影響size屬性。

    XStyle會對字型與圖片進行快取,以升階效能。若需清除快取,可呼叫該類別的靜態方法XStyle.clear_cache()

    建立按鈕 XButton

    XButton是按鈕物件,可接受多個XStyle,來表示不同狀態下的樣式。

    XButton(position, default_style, pressed_style=None, hovered_style=None, focused_style=None, disabled_style=None, name=None, text=None, disabled=False, hidden=False, confirm_keys=None, confirm_buttons=None, joystick_id=None, onclick=None)

    position 參數

    position表示按鈕的中心位置(如果在組中,則相對於組的左上角),可傳入一個包含 X 和 Y 座標的元組或串列。

    default_style 參數

    default_style是一個XStyle物件,表示按鈕的預設樣式。其他樣式以預設樣式為基礎,只需給出修改的內容,比如:文字色彩。

    pressed_style 參數

    pressed_style是一個XStyle物件,表示按鈕被按下時的樣式。

    hovered_style 參數

    hovered_style是一個XStyle物件,表示滑鼠暫留時的樣式。

    focused_style 參數

    focused_style是一個XStyle物件,表示獲得焦點時的樣式,對應鍵盤或控製器選取的按鈕。

    disabled_style 參數

    disabled_style是一個XStyle物件,表示按鈕被停用時的樣式。

    name 參數

    name表示按鈕的名稱,可用於識別按鈕。

    text 參數

    text表示按鈕顯示的文字。

    disabled 參數

    disabled表示按鈕是否處於停用狀態。

    hidden 參數

    hidden表示按鈕是否處於隱藏狀態。

    confirm_keys 參數

    confirm_keys表示一組鍵盤按鍵,當按鈕獲得焦點時,這些按鍵可用於點選按鈕(采用中文輸入法時可能無效)。如果忽略,則為(K_RETURN,K_KP_ENTER,K_SPACE)

    confirm_buttons 參數

    confirm_buttons表示一組控製器按鍵,當按鈕獲得焦點時,這些按鍵可用於點選按鈕。如果忽略,則為(CONTROLLER_BUTTON_A,)

    joystick_id 參數

    joystick_id表示可對按鈕進行操作的控製器的 ID(控製器必須在模組定義的joysticks變數中)。如果忽略,則joysticks變數中的所有控製器均可操作按鈕。

    onclick 參數

    onclick為處理按鈕點選事件的函式,形式為handle(**args)handle(button,kind,device)。其中,button為按鈕自身,kind表示觸發點選的裝置型別,可為'mouse'(滑鼠),'keyboard'(鍵盤),'joystick'(控製器),device表示觸發點選的裝置,僅支援控製器,型別為JoystickType

    在下面的範例中,建立了按鈕b_start,按鈕的座標為(400,300),顯示文字為Start,擁有預設樣式、滑鼠暫留時的樣式、按鈕被按下時的樣式、按鈕被停用時的樣式。

    同時,我們修改了可用於點選按鈕的鍵盤按鍵和控製器按鍵,他們分別為K_LCTRLCONTROLLER_BUTTON_B

    create.py
    from pygame import display, event, time, freetype, QUIT, CONTROLLER_BUTTON_B, K_LCTRL
    # …
    # 建立按鈕
    b_start = XButton(
    	(400, 300),
    	text='Start',
    	default_style=XStyle(
    		image=r'g-normal.png',
    		font=(r'Bitty.ttf', 50),
    		text_color='#2c360c'
    	),
    	hovered_style=XStyle(
    		image=r'g-hovered.png',
    		text_color='#4a5914',
    		scale=1.05
    	),
    	pressed_style=XStyle(
    		image=r'g-clicked.png',
    		text_offset=(0, 1)
    	),
    	disabled_style=XStyle(
    		image=r'g-disabled.png',
    		text_color='#505050',
    		scale=0.95,
    		font_style=freetype.STYLE_UNDERLINE
    	),
    	confirm_keys=(K_LCTRL,),
    	confirm_buttons=(CONTROLLER_BUTTON_B,)
    )

    更新與繪製 XButton 按鈕

    XButton物件的update方法,用於更新按鈕的狀態,需要在遊戲迴圈中呼叫,最好放在draw方法之前。

    update(pressed_keys)

    pressed_keys 參數

    pressed_keys參數是鍵盤按鍵的按下狀態(通常是key.get_pressed()的傳回值)。如果忽略該參數,那麽update方法將自行處理。

    XButton物件的draw方法,用於將按鈕繪製到指定Surface物件,需要在遊戲迴圈中呼叫,最好放在update方法之後。

    draw(surface)

    surface 參數

    surface參數是將被繪製按鈕的Surface物件。

    create.py
    # 準備工作
    import pygame
    from pygame import display, event, time, freetype, QUIT, CONTROLLER_BUTTON_B, K_LCTRL
    
    from xbutton import XButton, XStyle
    pygame.init() w = display.set_mode([800, 600]) c = time.Clock()

    # 建立按鈕 b_start = XButton( (400, 300), text='Start', default_style=XStyle( image=r'g-normal.png', font=(r'Bitty.ttf', 50), text_color='#2c360c' ), hovered_style=XStyle( image=r'g-hovered.png', text_color='#4a5914', scale=1.05 ), pressed_style=XStyle( image=r'g-clicked.png', text_offset=(0, 1) ), disabled_style=XStyle( image=r'g-disabled.png', text_color='#505050', scale=0.95, font_style=freetype.STYLE_UNDERLINE ) )
    buttons = [b_start]
    running = True while running: # 處理事件 for e in event.get(): if e.type == QUIT: running = False
    w.fill(0)
    # 更新繪製按鈕 for b in buttons: b.update() b.draw(w)
    display.flip() c.tick(60)

    繫結處理 XButton 按鈕事件

    目前XButton物件僅支援按鈕的點選事件,可通過建構子的onclick參數設定處理點選事件的函式,具體可檢視建立按鈕一段。

    在建立XButton物件之後,你還可以通過該物件的onclick變數,來重新設定點選事件的處理函式。

    在下面的範例中,button_onclick為按鈕b_hide的點選事件處理函式,該函式將切換按鈕的顯示狀態。

    event.py
    # 按鈕點選事件的處理函式
    def button_onclick(button, kind, device):
    	button.text = 'Show' if button.text == 'Hide' else 'Hide'
    
    b_hide = XButton( (400, 400), default_style=XStyle( image=r'g-normal.png', font=(r'Bitty.ttf', 50), text_color='#2c360c' ), text='Hide', name='h', onclick=button_onclick )

    取得和設定 XButton 按鈕的其他特性

    此外,XButton還擁有以下的特性,可用於取得或設定按鈕的某些狀態。

    name 變數

    name變數是按鈕的名稱,可用於識別按鈕。

    position 屬性

    position屬性是按鈕的中心位置,可以是元組和串列(形式為(x,y)[x,y]),或Vector2物件。

    text 屬性

    text屬性是按鈕上顯示的文字,請不要頻繁的設定該屬性,因為每一次設定都將建置文字對應的Surface物件。

    disabled 變數

    disabled變數表示按鈕是否處於停用狀態。

    hidden 變數

    hidden變數表示按鈕是否處於隱藏狀態。

    joystick_id 變數

    joystick_id變數用於指定可對按鈕進行操作的控製器的 ID(控製器必須在模組定義的joysticks變數中),如果為None,則joysticks變數中的所有控製器均可操作按鈕。

    keyboard_entered 變數

    keyboard_entered變數表示按鈕是否因為鍵盤操作獲得了焦點,如果設定為True,則按鈕處於選取(獲得焦點)狀態。

    joystick_entered 變數

    joystick_entered變數表示按鈕是否因為控製器操作獲得了焦點,如果設定為True,則按鈕處於選取(獲得焦點)狀態。

    hovered 屬性

    hovered屬性表示滑鼠是否暫留在了按鈕上。

    focused 屬性

    focused屬性配合XGroup使用,表示按鈕是否獲得了焦點(預設按鈕會在開始時獲得焦點),鍵盤或控製器可切換按鈕的焦點。

    pressed 屬性

    pressed屬性表示按鈕是否被按下。

    建立控製項組 XGroup

    XGroup物件是一個控製項組類別,用處理多個控製項的邏輯關系,使鍵盤或控製器可以切換控製項的焦點,並實作對控製項的某些操作。這裏,你可以將控製項理解為XButton

    XGroup(position, items, default_item=None, name=None, disabled=False, hidden=False, navigation_keys=None, navigation_hat=None, navigation_axes=None, joystick_id=None, onchange=None)

    position 參數

    position表示組的左上角位置,將影響組中的所有控製項,可傳入一個包含 X 和 Y 座標的元組或串列。

    items 參數

    items是一個巢狀序列,用於表示組中的控製項布局。比如,[[b1,b2],[b3,b4]],表示b1b2的左邊和b3的上邊,b4b3的右邊和b2的下邊,空位置可用None代替。

    default_item 參數

    default_item為組中的預設控製項,預設控製項在開始時擁有焦點。如果未指定,則第一個出現的控製項為預設控製項。

    name 參數

    name表示組的名稱,可用於識別組。

    disabled 參數

    disabled表示組是否處於停用狀態。

    hidden 參數

    hidden表示組是否處於隱藏狀態。

    navigation_keys 參數

    navigation_keys為包含用於切換控製項焦點的鍵盤按鍵的元組(采用中文輸入法時可能無效),形式為(up,down,left,right)。如果忽略,則采用(K_UP,K_DOWN,K_LEFT,K_RIGHT)

    navigation_hat 參數

    navigation_hat為用於切換控製項焦點的控製器方向鍵 ID。如果忽略,則為0

    navigation_axes 參數

    navigation_axes為用於切換控製項焦點的控製器軸裝置資訊。如果忽略,則為((1,0.3),(0,0.3)),其中0.3為觸發操作的閾值,1為觸發上下操作的軸裝置 ID,0為觸發左右操作的軸裝置 ID。

    joystick_id 參數

    joystick_id為可以對組進行操作的控製器的 ID(控製器必須在模組定義的joysticks變數中)。如果忽略,則joysticks變數中的所有控製器均可操作組。

    onchange 參數

    onchange是一個函式,用於處理焦點控製項發生變化的事件,形式為handle(**args)handle(group, focused, blurred),其中,group為控製項組自身,focused為獲得焦點的控製項,blurred為失去焦點的控製項。

    在下面的範例中,我們建立了三個按鈕b_startb_enableb_hide。在邏輯關系上,他們按照順序從上至下排列,預設擁有焦點的按鈕是b_enable

    group.py
    # 定義樣式並建立按鈕
    g_style = {
    	"default_style": XStyle(
    		image=r'g-normal.png',
    		font=(r'Bitty.ttf', 50),
    		text_color='#2c360c'
    	),
    	"hovered_style": XStyle(
    		image=r'g-hovered.png',
    		text_color='#4a5914',
    		scale=1.05
    	),
    	"pressed_style": XStyle(
    		image=r'g-clicked.png',
    		text_offset=(0, 1)
    	),
    	"disabled_style": XStyle(
    		image=r'g-disabled.png',
    		text_color='#505050',
    		scale=0.95,
    		font_style=freetype.STYLE_UNDERLINE
    	),
    	"focused_style": XStyle(
    		image=r'g-hovered.png',
    		font=(r'Bitty.ttf', 55),
    		text_color='#181c0b',
    		scale=1.05
    	)
    }
    
    b_start = XButton((0, 200), **g_style, text='Start', disabled=True) b_enable = XButton((0, 300), **g_style, text='Enable', name='e') b_hide = XButton((0, 400), **g_style, text='Hide', name='h')

    g = XGroup( (400, 0), [ [b_start], [b_enable], [b_hide] ], b_enable )

    更新與繪製 XGroup 控製項組

    XGroup物件的update方法,用於更新控製項組和組中所有控製項的狀態,需要在遊戲迴圈中呼叫,最好放在draw方法之前。

    update(pressed_keys)

    pressed_keys 參數

    pressed_keys參數是鍵盤按鍵的按下狀態(通常是key.get_pressed()的傳回值)。如果忽略該參數,那麽update方法將自行處理。

    XGroup物件的draw方法,用於將控製項組中的控製項繪製到指定Surface物件,需要在遊戲迴圈中呼叫,最好放在update方法之後。

    draw(surface)

    surface 參數

    surface參數是將被繪製控製項的Surface物件。

    group.py
    js: list[joystick.JoystickType] = []
    # NOTE 只有包含在 joysticks 中的控製器,才能操作按鈕和控製項組
    xbutton.joysticks = js
    running = True
    while running:
    	# 在控製器連線和中斷連線時,更新 js
    	for e in event.get():
    		if e.type == QUIT:
    			running = False
    		elif e.type == JOYDEVICEADDED:
    			j = joystick.Joystick(e.device_index)
    			js.append(j)
    		elif e.type == JOYDEVICEREMOVED:
    			for j in js:
    				if j.get_instance_id() == e.instance_id:
    					js.remove(j)
    					break
    
    w.fill(0)
    g.update(key.get_pressed()) g.draw(w) # …

    繫結處理 XGroup 控製項組事件

    目前XGroup物件僅支援焦點控製項發生變化的事件,可通過建構子的onchange參數設定處理事件的函式,具體可檢視建立控製項組一段。

    在建立XGroup物件之後,你還可以通過該物件的onchange變數,來重新設定焦點控製項發生變化的事件的處理函式。

    在下面的範例中,將顯示獲得焦點以及失去焦點的按鈕的文字。

    group_event.py
    # 焦點控製項發生變化的事件的處理函式
    def group_onchange(group, focused, blurred):
    	if focused:
    		print(f'Focus {focused.text}')
    	if blurred:
    		print(f'Blur {blurred.text}')
    
    g = XGroup( (400, 0), [ [b_start], [b_enable], [b_hide] ], b_enable, onchange=group_onchange )

    取得和設定 XGroup 控製項組的其他特性

    此外,XGroup還擁有以下的特性,可用於取得或設定控製項組的某些狀態。

    name 變數

    name變數是組的名稱,可用於識別組。

    position 變數

    position變數是組的左上角位置,可以是元組和串列(形式為(x, y)[x, y]),或Vector2物件,該位置將影響組中的所有控製項。

    disabled 屬性

    disabled屬性表示組是否處於停用狀態。

    hidden 屬性

    hidden屬性表示組是否處於隱藏狀態。

    joystick_id 屬性

    joystick_id屬性用於指定可對組進行操作的控製器的 ID(控製器必須在模組定義的joysticks變數中)。如果為None,則joysticks變數中的所有控製器均可操作組。

    current 屬性

    current屬性表示目前具有焦點的控製項。

    原始碼

    src/zh-hant/x/xbutton·codebeatme/pygame·GitHub

    講解影片

    Pygame 快捷實用按鈕控製項模組 xbutton,支援多狀態樣式、分配按鍵和手把、鍵盤和手把的導覽選取操作·YouTube