如何通過 Python 腳本使用控製項與 OBS 使用者互動?OBS 屬性集物件介紹

閱讀 48:24·字數 14521·發佈 
Youtube 頻道
訂閱 133

本節中的“設定項”是指 OBS 資料設定物件中的設定項,本節範例演示了 Python 腳本對應的控製項,因此采用“腳本設定”一詞。

Python 腳本中的 OBS 屬性集物件

OBS 屬性集物件(Properties Objects)主要用於在 OBS 視窗中的建置相關的控製項,比如,Python 腳本在腳本視窗中對應的控製項,以及 OBS 來源(由來源產生的場景項)在其設定視窗中對應的控製項。OBS 屬性集物件可包含一組屬性物件,每一個屬性物件對應一個具體的控製項。

OBS 屬性集物件一般使用資料設定物件來儲存屬性對應的值,屬性集中的屬性物件與資料設定物件中的設定項存在對應關系。

兩個 OBS 屬性物件不能對應 OBS 資料設定物件中的同一個項

需要說明的是,兩個 OBS 屬性物件不能對應 OBS 資料設定物件中的同一個項。否則,相關控製項可能無法被建立,或無法正常顯示在 OBS 視窗中。

資料設定

想要詳細了解 OBS 資料設定物件,你可以檢視如何在 Python 腳本中使用 OBS 資料設定物件?OBS 資料設定物件介紹一節。

在 Python 腳本中建立和終結 OBS 屬性集物件

obspython模組的obs_properties_create函式,可用於建立一個 OBS 屬性集物件,他將包含所有控製項對應的屬性物件。

obs_properties_create()

obspython模組的obs_properties_destroy函式,可用於終結一個 OBS 屬性集物件,如果該屬性集物件已經作為script_properties函式的傳回值,那麽終結可能導致例外狀況。

obs_properties_destroy(props)

props 參數

props參數是需要終結的 OBS 屬性集物件。

通過 Python 腳本取得和設定 OBS 視窗中控製項的屬性

obspython模組提供了以下的通用函式,用於取得或設定 OBS 視窗中控製項的屬性。其中,參數p為控製項對應的屬性物件。

obs_property_descriptionobs_property_set_description函式,用於取得和設定控製項的描述資訊,對於按鈕控製項來說,描述資訊等同於按鈕控製項上顯示的文字。

obs_property_description(p)
obs_property_set_description(p, description)

description 參數

description參數為控製項的描述資訊。

obs_property_visibleobs_property_set_visible函式,用於取得和設定控製項是否可見,即控製項是顯示的還是隱藏的。

obs_property_visible(p)
obs_property_set_visible(p, visible)

visible 參數

visible參數為True時,將設定控製項可見,為False時,將設定控製項隱藏。

obs_property_enabledobs_property_set_enabled函式,用於取得和設定控製項是否可用,即控製項是啟用的還是停用的。

obs_property_enabled(p)
obs_property_set_enabled(p, enabled)

enabled 參數

enabled參數為False時,將停用控製項。

obs_property_name用於取得控製項對應的資料設定物件中項的名稱,當然,你也可以將其理解為控製項的名稱。

obs_property_name(p)

obs_property_get_type函式將傳回一個表示控製項類型的整數,可能等於以下某個obspython模組變數,OBS_PROPERTY_INVALIDOBS_PROPERTY_BOOLOBS_PROPERTY_INTOBS_PROPERTY_FLOATOBS_PROPERTY_TEXTOBS_PROPERTY_PATHOBS_PROPERTY_LISTOBS_PROPERTY_COLOROBS_PROPERTY_BUTTONOBS_PROPERTY_FONTOBS_PROPERTY_EDITABLE_LISTOBS_PROPERTY_FRAME_RATEOBS_PROPERTY_GROUPOBS_PROPERTY_COLOR_ALPHA

obs_property_get_type(p)

obs_property_set_modified_callback函式,用於指定一個回呼函式或方法,該函式或方法將在控製項被有效編輯時呼叫。

obs_property_set_modified_callback(p, modified)

modified 參數

modified參數為指定的回呼函式或方法,回呼函式和方法應該具有三個參數,分別是控製項所在的 OBS 屬性集物件,控製項對應的屬性物件,以及屬性集物件對應的資料設定物件。

盡量通過 script_update 函式而非 obs_property_set_modified_callback 監視控製項屬性的改變

對於某些控製項,比如色彩對話方塊,使用obs_property_set_modified_callback監視其屬性的改變會帶來一些邏輯上的問題,你應盡可能的通過script_update函式完成監視改變的任務。

呼叫 obs_property_set_description,obs_property_set_visible,obs_property_set_enabled 函式的控製項回呼函式或方法需要傳回 True

如果一個控製項在其回呼函式或方法中,呼叫了obs_property_set_descriptionobs_property_set_visibleobs_property_set_enabled函式,那麽回呼函式或方法可能需要傳回特定值True,否則,產生的效果將無法顯現。

OBS obspython 模組提供的關於控製項的通用函式在一些情況下是無效的

obspython模組所提供的關於控製項的通用函式,在有些情況下是無效的,比如在 Python 腳本定義的script_update函式中,呼叫obs_property_set_visibleobs_property_set_enabled不會達到預期效果。

通過 Python 腳本使用核取方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_bool函式,用於新增核取方塊控製項。

obs_properties_add_bool(props, name, description)

props 參數

props參數為需要新增核取方塊控製項的 OBS 屬性集物件。

name 參數

name參數為核取方塊控製項對應的設定項名稱。

description 參數

description參數為核取方塊控製項的描述資訊。

如何在 OBS Python 腳本中取得核取方塊控製項的選取狀態?

OBS 並沒有提供直接取得核取方塊控製項選取狀態的函式,但你可以通過obs_data_get_bool讀取控製項對應的設定項的值,來完成該目標。

Python 腳本properties.py擁有一個核取方塊auto(核取方塊對應的設定項名稱),其預設選取狀態被設定為True(通過指定設定項的預設值)。在函式script_load中,我們將根據核取方塊的選取狀態(對應的設定項的值)來決定是否執行任務。

properties.py
# 匯入模組 obspython
import obspython as obs

def script_properties(): # 建立一個屬性集物件 props = obs.obs_properties_create()
# 新增一個核取方塊,用於控製是否在腳本載入後執行任務 obs.obs_properties_add_bool(props, 'auto', '在啟動時執行任務?') return props
def script_defaults(settings): # 設定控製項的預設值 obs.obs_data_set_default_bool(settings, 'auto', True)
def script_load(settings): # 是否在腳本載入後執行任務? if obs.obs_data_get_bool(settings, 'auto'): obs.script_log(obs.LOG_INFO, f'在啟動時執行任務(是的)')
[properties.py] 在啟動時執行任務(是的)

通過 Python 腳本使用微調方塊,滑桿控製項與 OBS 使用者互動

obspython模組的obs_properties_add_intobs_properties_add_int_slider函式,可用於新增表現為整數的微調方塊和滑桿控製項,obs_properties_add_floatobs_properties_add_float_slider函式,可用於新增表現為小數的微調方塊和滑桿控製項。

obs_properties_add_int(props, name, description, min, max, step)
obs_properties_add_float(props, name, description, min, max, step)
obs_properties_add_int_slider(props, name, description, min, max, step)
obs_properties_add_float_slider(props, name, description, min, max, step)

props 參數

props參數為需要新增微調方塊或滑桿控製項的 OBS 屬性集物件。

name 參數

name參數為微調方塊或滑桿控製項對應的設定項名稱。

description 參數

description參數為微調方塊或滑桿控製項的描述資訊。

min 參數

min參數為微調方塊或滑桿控製項的最小值。

max 參數

max參數為微調方塊或滑桿控製項的最大值。

step 參數

step參數為微調方塊或滑桿控製項的間距。

obspython模組的obs_property_int_set_limitsobs_property_float_set_limits函式,可用於設定微調方塊或滑桿控製項的最小值,最大值和間距。

obs_property_int_set_limits(p, min, max, step)
obs_property_float_set_limits(p, min, max, step)

p 參數

p參數為微調方塊或滑桿控製項對應的屬性物件。

min 參數

min參數為微調方塊或滑桿控製項調整後的最小值。

max 參數

max參數為微調方塊或滑桿控製項調整後的最大值。

step 參數

step參數為微調方塊或滑桿控製項調整後的間距。

obspython模組的obs_property_int_minobs_property_int_maxobs_property_int_stepobs_property_int_typeobs_property_float_minobs_property_float_maxobs_property_float_stepobs_property_float_type函式,可用於取得微調方塊或滑桿控製項的最小值,最大值,間距以及類型(微調方塊對應的類型為OBS_NUMBER_SCROLLER,滑桿控製項對應的類型為OBS_NUMBER_SLIDER)。

obs_property_int_min(p)
obs_property_int_max(p)
obs_property_int_step(p)
obs_property_int_type(p)
obs_property_float_min(p)
obs_property_float_max(p)
obs_property_float_step(p)
obs_property_float_type(p)

p 參數

p參數為微調方塊或滑桿控製項對應的屬性物件。

obspython模組的obs_property_int_suffixobs_property_float_suffixobs_property_int_set_suffixobs_property_float_set_suffix函式,可用於取得和設定微調方塊或滑桿控製項的尾碼,尾碼將顯示在數值的後面,無法被 OBS 使用者編輯。

obs_property_int_suffix(p)
obs_property_float_suffix(p)
obs_property_int_set_suffix(p, suffix)
obs_property_float_set_suffix(p, suffix)

p 參數

p參數為微調方塊或滑桿控製項對應的屬性物件。

suffix 參數

suffix參數為需要設定的尾碼。

如何在 OBS Python 腳本中取得微調方塊或滑桿控製項的目前數值?

OBS 並沒有提供直接取得微調方塊或滑桿控製專案前數值的函式,但你可以通過obs_data_get_intobs_data_get_float讀取控製項對應的設定項的值,來完成該目標。

下面,我們為腳本properties.py新增一個滑桿delay(滑桿對應的設定項名稱),用於控製任務函式task的延遲執行時間,其預設值為1.5(通過指定設定項的預設值)。

properties.py
def script_properties():
	# …
	# 新增一個小數滑桿,用於表示延遲執行任務的時間,尾碼為字串 '秒'
	delay = obs.obs_properties_add_float_slider(props, 'delay', '延遲秒數', 1, 10, 0.5)
	obs.obs_property_float_set_suffix(delay, '秒')
	# …

def script_defaults(settings): # … obs.obs_data_set_default_double(settings, 'delay', 1.5)
# 執行任務的函式 task def task(): obs.script_log(obs.LOG_INFO, '任務開始了') obs.remove_current_callback()
def script_load(settings): # 是否在腳本載入後執行任務? if obs.obs_data_get_bool(settings, 'auto'): # … # 新增執行任務的計時器,時間間隔為滑桿表示的秒數 seconds = obs.obs_data_get_double(settings, 'delay') obs.script_log(obs.LOG_INFO, f'請等待大約 {seconds} 秒') obs.timer_add(task, int(seconds * 1000))

[properties.py] 請等待大約 1.5 秒
[properties.py] 任務開始了

通過 Python 腳本使用文字方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_text函式,可用於新增可編輯文字方塊或唯讀文字方塊控製項。

obs_properties_add_text(props, name, description, type)

props 參數

props參數為需要新增文字方塊控製項的 OBS 屬性集物件。

name 參數

name參數為文字方塊控製項對應的設定項名稱。

description 參數

description參數為文字方塊控製項的描述資訊。

type 參數

type參數為文字方塊控製項的類型,可使用如下obspython模組變數進行設定,OBS_TEXT_DEFAULT表示單行文字方塊,OBS_TEXT_PASSWORD表示單行密碼文字方塊,OBS_TEXT_MULTILINE表示多行文字方塊,OBS_TEXT_INFO表示不可編輯的唯讀文字方塊,效果類似於標簽。

obspython模組的obs_property_text_set_info_type函式,可用於設定唯讀文字方塊控製項的資訊類型。

obs_property_text_set_info_type(p, type)

p 參數

p參數為唯讀文字方塊控製項對應的屬性物件。

type 參數

type參數為唯讀文字方塊控製項的資訊類型,可使用如下obspython模組變數進行設定,OBS_TEXT_INFO_NORMAL表示正常資訊,OBS_TEXT_INFO_WARNING表示警告資訊,OBS_TEXT_INFO_ERROR表示錯誤資訊。

obspython模組的obs_property_text_set_info_word_wrap函式,可用於設定唯讀文字方塊控製項是否支援根據單詞自動換行。

obs_property_text_set_info_word_wrap(p, word_wrap)

p 參數

p參數為唯讀文字方塊控製項對應的屬性物件。

word_wrap 參數

word_wrap參數表示唯讀文字方塊控製項是否支援根據單詞自動換行,預設情況下是支援的。

obspython模組的obs_property_text_type函式,可用於取得文字方塊控製項的類型,obs_property_text_info_type函式,可用於取得唯讀文字方塊控製項的資訊類型,obs_property_text_info_word_wrap函式,可用於取得唯讀文字方塊控製項是否支援換行,obs_property_text_monospace函式,可用於取得多行文字方塊控製項是否以等寬字型(monospace)繪製。

obs_property_text_type(p)
obs_property_text_info_type(p)
obs_property_text_info_word_wrap(p)
obs_property_text_monospace(p)

p 參數

p參數為文字方塊控製項對應的屬性物件。

如何在 OBS Python 腳本中取得文字方塊控製項的目前文字?

OBS 並沒有提供直接取得文字方塊文字的函式,但你可以通過obs_data_get_string讀取控製項對應的設定項的值,來完成該目標。

下面,我們為腳本properties.py新增一個文字方塊message(文字方塊對應的設定項名稱),其文字內容(對應的設定項的值)將被函式task輸出至指令稿記錄視窗

properties.py
def script_properties():
	# …
	# 新增一個文字方塊,用於表示需要傳送的訊息
	obs.obs_properties_add_text(props, 'message', '訊息:', obs.OBS_TEXT_MULTILINE)
	# …

# 變數 current_settings 用於表示腳本設定 current_settings = None
# 執行任務的函式 task def task(): # … # 顯示文字方塊中的訊息 message = obs.obs_data_get_string(current_settings, 'message') obs.script_log(obs.LOG_INFO, f'訊息為 {message if message else "[空]"}')
def script_load(settings): global current_settings current_settings = settings # …

[properties.py] 訊息為 [空]

通過 Python 腳本使用按鈕控製項與 OBS 使用者互動

obspython模組的obs_properties_add_button函式,可用於新增按鈕控製項。

obs_properties_add_button(props, name, text, callback)

props 參數

props參數為需要新增按鈕控製項的 OBS 屬性集物件。

name 參數

name參數為按鈕控製項對應的設定項名稱。

text 參數

text參數為按鈕控製項上顯示的文字資訊。

callback 參數

callback參數為按鈕控製項被點選時的回呼函式或方法,回呼函式和方法應該具有兩個參數,分別是按鈕控製項所在的 OBS 屬性集物件,以及按鈕控製項對應的屬性物件。

obspython模組的obs_property_button_set_type函式,可用於設定按鈕控製項的類型。

obs_property_button_set_type(p, type)

p 參數

p參數為按鈕控製項對應的屬性物件。

type 參數

type參數為按鈕控製項的類型,可使用如下obspython模組變數進行設定,OBS_BUTTON_DEFAULT表示標準普通按鈕,OBS_BUTTON_URL表示可開啟指定 URL 的連結按鈕。

obspython模組的obs_property_button_set_url函式,可用於指定按鈕控製項的 URL,需要使用函式obs_property_button_set_type將按鈕控製項設定為連結按鈕,否則無法產生效果。

obs_property_button_set_url(p, url)

p 參數

p參數為按鈕控製項對應的屬性物件。

url 參數

url參數為需要開啟的 URL,他必須符合格式要求,擁有httpshttp首碼。

obspython模組的obs_property_button_typeobs_property_button_url函式,可用於取得按鈕控製項的類型以及按鈕控製項對應的 URL。

obs_property_button_type(p)
obs_property_button_url(p)

p 參數

p參數為按鈕控製項對應的屬性物件。

下面,我們為腳本properties.py新增一個按鈕again(按鈕對應的設定項名稱),當他被點選時,函式task將再次執行。

properties.py
def script_properties():
	# …
	# 新增一個按鈕,用於再次執行 task 函式
	obs.obs_properties_add_button(props, 'again', '再次執行', lambda ps, p: task())
	# …
[properties.py] 任務開始了
[properties.py] 訊息為 [空]

通過 Python 腳本使用下拉式方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_list函式,可用於新增下拉式方塊控製項。

obs_properties_add_list(props, name, description, type, format)

props 參數

props參數為需要新增下拉式方塊控製項的 OBS 屬性集物件。

name 參數

name參數為下拉式方塊控製項對應的設定項名稱。

description 參數

description參數為下拉式方塊控製項的描述資訊。

type 參數

type參數為下拉式方塊控製項的類型,可使用如下obspython模組變數進行設定,OBS_COMBO_TYPE_EDITABLE表示可編輯下拉式方塊,僅適用於字串格式,使用者可以輸入自己的內容,OBS_COMBO_TYPE_LIST表示不可編輯下拉式方塊。

format 參數

format參數為下拉式方塊控製項的格式,可使用如下obspython模組變數進行設定,OBS_COMBO_FORMAT_INT表示整數下拉式方塊(在 Windows 中不可用),OBS_COMBO_FORMAT_FLOAT表示浮點數下拉式方塊(在 Windows 中不可用),OBS_COMBO_FORMAT_STRING表示字串下拉式方塊。

obspython模組的obs_property_list_typeobs_property_list_format函式,可用於取得下拉式方塊控製項的類型和格式。

obs_property_list_type(p)
obs_property_list_format(p)

p 參數

p參數為下拉式方塊控製項對應的屬性物件。

obspython模組的obs_property_list_add_stringobs_property_list_add_intobs_property_list_add_floatobs_property_list_insert_stringobs_property_list_insert_intobs_property_list_insert_float函式,可用於新增或插入項至下拉式方塊控製項。

obs_property_list_add_string(p, name, val)
obs_property_list_add_int(p, name, val)
obs_property_list_add_float(p, name, val)
obs_property_list_insert_string(p, idx, name, val)
obs_property_list_insert_int(p, idx, name, val)
obs_property_list_insert_float(p, idx, name, val)

p 參數

p參數為下拉式方塊控製項對應的屬性物件。

name 參數

name參數為新增或插入項的名稱,他將顯示給使用者。

val 參數

val參數為新增或插入項的值。

idx 參數

idx參數為插入項的位置,0表示開始位置,你需要為該參數指定一個有效的值,否則可能導致錯誤。

obspython模組的obs_property_list_item_countobs_property_list_item_nameobs_property_list_item_stringobs_property_list_item_intobs_property_list_item_float函式,可用於取得下拉式方塊控製項中的項的總數,項的名稱,項的值。

obs_property_list_item_count(p)
obs_property_list_item_name(p, idx)
obs_property_list_item_string(p, idx)
obs_property_list_item_int(p, idx)
obs_property_list_item_float(p, idx)

p 參數

p參數為下拉式方塊控製項對應的屬性物件。

idx 參數

idx參數為項的位置,0表示開始位置,你需要為該參數指定一個有效的值,否則可能導致錯誤。

obspython模組的obs_property_list_item_remove函式,可用於移除下拉式方塊控製項中的某個項。

obs_property_list_item_remove(p, idx)

p 參數

p參數為下拉式方塊控製項對應的屬性物件。

idx 參數

idx參數為被移除項的位置,0表示開始位置,你需要為該參數指定一個有效的值,否則可能導致錯誤。

obspython模組的obs_property_list_item_disabledobs_property_list_item_disable函式,可用於取得或設定下拉式方塊控製項的某個項是否被停用。

obs_property_list_item_disabled(p, idx)
obs_property_list_item_disable(p, idx, disabled)

p 參數

p參數為下拉式方塊控製項對應的屬性物件。

idx 參數

idx參數為設定是否停用的項的位置,0表示開始位置,你需要為該參數指定一個有效的值,否則可能導致錯誤。

disabled 參數

disabled表示是否停用項,為True時,將停用。

obspython模組的obs_property_list_clear函式,可用於清空下拉式方塊控製項中的所有項。

obs_property_list_clear(p)

p 參數

p參數為下拉式方塊控製項對應的屬性物件。

如何在 OBS Python 腳本中取得下拉式方塊控製項的目前選取項?

OBS 並沒有提供直接取得下拉式方塊目前選取項的函式,但你可以通過obs_data_get_intobs_data_get_floatobs_data_get_string讀取控製項對應的設定項的值,來完成該目標,他們對應了目前選取項的值。

下面,我們為腳本properties.py新增一個下拉式方塊platform(下拉式方塊對應的設定項名稱),用於讓使用者選擇串流平臺,選擇的結果(對應的設定項的值)將被函式task輸出至指令稿記錄視窗

properties.py
def script_properties():
	# …
	# 新增一個下拉式方塊,用於選擇串流平臺
	platform = obs.obs_properties_add_list(props, 'platform', '串流平臺:', obs.OBS_COMBO_TYPE_LIST, obs.OBS_COMBO_FORMAT_STRING)
	# 為下拉式方塊新增項,需要給出項的名稱和值
	obs.obs_property_list_add_string(platform, 'YouTube', 'yt')
	obs.obs_property_list_add_string(platform, 'Twitch', 't')
	# 在下拉式方塊的第二個位置插入項,並使其不可用
	obs.obs_property_list_insert_string(platform, 1, 'Unkown', 'u')
	obs.obs_property_list_item_disable(platform, 1, True)
	# …

# 執行任務的函式 task def task(): # … # 顯示選擇的串流平臺 platform = obs.obs_data_get_string(current_settings, 'platform') obs.script_log(obs.LOG_INFO, f'串流平臺為 {platform}')

[properties.py] 串流平臺為 yt

通過 Python 腳本使用檔案對話方塊,資料夾對話方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_path函式,可用於新增檔案或資料夾對話方塊控製項,該控製項可讓使用者選擇檔案或資料夾的路徑。

obs_properties_add_path(props, name, description, type, filter, default_path)

props 參數

props參數為需要新增檔案或資料夾對話方塊控製項的 OBS 屬性集物件。

name 參數

name參數為檔案或資料夾對話方塊控製項對應的設定項名稱。

description 參數

description參數為檔案或資料夾對話方塊控製項的描述資訊。

type 參數

type參數為檔案或資料夾對話方塊控製項的類型,可使用如下obspython模組變數進行設定,OBS_PATH_FILE表示讀取檔案的對話方塊,OBS_PATH_FILE_SAVE表示寫入檔案的對話方塊,OBS_PATH_DIRECTORY表示選擇資料夾的對話方塊。

filter 參數

當你新增一個用於讀取檔案的對話方塊控製項時,filter參數將控製使用者能夠看到的檔案種類(篩選條件),該參數可包含多個使用雙分號分隔的項目,每個項目可包含一個或更多使用空格分隔的檔案副檔名。比如,"圖片(*.jpg *.png);音訊(*.wav)"

default_path 參數

default_path參數為檔案或資料夾對話方塊控製項的預設起始路徑,可以為空值None

obspython模組的obs_property_path_typeobs_property_path_default_path函式,可用於取得對話方塊控製項的類型和預設路徑,obs_property_path_filter函式,可用於取得讀取檔案對話方塊控製項的篩選條件。

obs_property_path_type(p)
obs_property_path_default_path(p)
obs_property_path_filter(p)

p 參數

p參數為檔案或資料夾對話方塊控製項對應的屬性物件。

如何在 OBS Python 腳本中取得檔案或資料夾對話方塊控製項的目前路徑?

OBS 並沒有提供直接取得檔案或資料夾對話方塊目前路徑的函式,但你可以通過obs_data_get_string讀取控製項對應的設定項的值,來完成該目標。

下面,我們為腳本properties.py新增一個檔案對話方塊more(檔案對話方塊對應的設定項名稱),用於讓使用者選擇文字檔案,該文字檔案的內容將寫入文字方塊。由於使用了obs_properties_apply_settings,因此,load_message函式將被呼叫兩次(事實上,應該避免這種可能導致無限迴圈的做法)。

properties.py
# 函式 load_message 將讀取文字檔案中的內容,並將其寫入文字方塊
def load_message(props, prop, settings):
	# 取得檔案對話方塊中的檔案路徑
	path = obs.obs_data_get_string(settings, 'more')

if path: # 從檔案讀取內容 file = open(path, 'r', encoding='utf-8') content = file.read() file.close()
# 將內容設定到文字方塊中,如果內容與文字方塊不一致 if content != obs.obs_data_get_string(settings, 'message'): obs.obs_data_set_string(settings, 'message', content) # 立即將腳本設定更新至控製項,這將導致 load_message 再次被呼叫 obs.obs_properties_apply_settings(props, settings) # 這裏需要傳回特定值 True return True
def script_properties(): # … # 新增一個檔案對話方塊,用於載入更多的訊息 more = obs.obs_properties_add_path(props, 'more', '更多訊息:', obs.OBS_PATH_FILE, '文字檔案(*.txt)', None) # 當使用者選擇了一個檔案後,函式 load_message 將被呼叫 obs.obs_property_set_modified_callback(more, load_message) # …

通過 Python 腳本使用色彩對話方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_colorobs_properties_add_color_alpha函式,均可以新增色彩對話方塊控製項,兩者的區別在於是否可以設定透明度。

obs_properties_add_color(props, name, description)
obs_properties_add_color_alpha(props, name, description)

props 參數

props參數為需要新增色彩對話方塊控製項的 OBS 屬性集物件。

name 參數

name參數為色彩對話方塊控製項對應的設定項名稱。

description 參數

description參數為色彩對話方塊控製項的描述資訊。

如何在 OBS Python 腳本中取得色彩對話方塊控製項的目前色彩?

OBS 並沒有提供直接取得色彩對話方塊目前色彩的函式,但你可以通過obs_data_set_int讀取控製項對應的設定項的值,來完成該目標。

下面,為腳本properties.py新增一個色彩對話方塊color(色彩對話方塊對應的設定項名稱),用於讓使用者為場景中的文字來源設定色彩,這會涉及與 OBS 資料設定物件和來源相關的函式,由於篇幅限製,我們不再進行說明。

要使下面的範例得以執行,場景應具有名稱為Welcome的文字來源,色彩對話方塊的預設色彩,可能會讓文字來源無法被清晰分辨。

properties.py
# 函式 set_source_color 將色彩對話方塊指定的色彩,設定到文字來源
def set_source_color(settings):
	# 取得色彩對話方塊所確定的色彩
	color = obs.obs_data_get_int(settings, 'color')

# 為場景中的文字來源 Welcome 設定色彩 source = obs.obs_get_source_by_name('Welcome') data = obs.obs_data_create() obs.obs_data_set_int(data, 'color', color) obs.obs_source_update(source, data) obs.obs_data_release(data) obs.obs_source_release(source)
def script_properties(): # … # 新增一個色彩對話方塊,用於設定文字來源的色彩 obs.obs_properties_add_color(props, 'color', '色彩:') # …
def script_update(settings): # 使用者編輯控製項後,將最新的腳本設定應用至場景 set_source_color(settings)

通過 Python 腳本使用字型對話方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_font函式,可用於新增字型對話方塊控製項,該控製項可讓使用者選擇字型。

obs_properties_add_font(props, name, description)

props 參數

props參數為需要新增字型對話方塊控製項的 OBS 屬性集物件。

name 參數

name參數為字型對話方塊控製項對應的設定項名稱。

description 參數

description參數為字型對話方塊控製項的描述資訊。

如何在 OBS Python 腳本中取得字型對話方塊控製項的目前字型?

OBS 並沒有提供直接取得字型對話方塊目前字型的函式,但你可以通過obs_data_get_obj讀取控製項對應的設定項的值,來完成該目標,他是一個包含字型資訊的 OBS 資料設定物件。

下面,為腳本properties.py新增一個字型對話方塊font(字型對話方塊對應的設定項名稱),用於讓使用者為場景中的文字來源設定字型,這會涉及與 OBS 資料設定物件和來源相關的函式,由於篇幅限製,我們不再進行說明。

要使下面的範例得以執行,場景應具有名稱為Welcome的文字來源,字型對話方塊的預設字型,可能會讓文字來源無法被清晰分辨。

properties.py
# 函式 set_source_font 將字型對話方塊指定的字型,設定到文字來源
def set_source_font(settings):
	# 取得字型對話方塊所確定的字型
	font = obs.obs_data_get_obj(settings, 'font')

# 為場景中的文字來源 Welcome 設定字型 source = obs.obs_get_source_by_name('Welcome') data = obs.obs_data_create() obs.obs_data_set_obj(data, 'font', font) obs.obs_source_update(source, data) obs.obs_data_release(font) obs.obs_data_release(data) obs.obs_source_release(source)
def script_properties(): # … # 新增一個字型對話方塊,用於設定文字來源的字型 obs.obs_properties_add_font(props, 'font', '字型:') # …
def script_update(settings): # … set_source_font(settings)

通過 Python 腳本使用可編輯清單方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_editable_list函式,可用於新增可編輯清單方塊控製項,該控製項提供新增,編輯和刪除項的功能。比如,使用者可新增一組圖片檔案的路徑,以隨機的顯示其中一個。

obs_properties_add_editable_list(props, name, description, type, filter, default_path)

props 參數

props參數為需要新增清單方塊控製項的 OBS 屬性集物件。

name 參數

name參數為清單方塊控製項對應的設定項名稱。

description 參數

description參數為清單方塊控製項的描述資訊。

type 參數

type參數為清單方塊控製項的類型,可使用如下obspython模組變數進行設定,OBS_EDITABLE_LIST_TYPE_STRINGS表示字串清單方塊,OBS_EDITABLE_LIST_TYPE_FILES表示檔案路徑清單方塊,OBS_EDITABLE_LIST_TYPE_FILES_AND_URLS表示檔案路徑和網址清單方塊。

filter 參數

filter參數為清單方塊控製項的篩選條件(將控製使用者能夠看到的檔案種類),如果允許新增檔案路徑的話。

default_path 參數

default_path參數為清單方塊控製項的預設起始路徑,如果允許新增檔案路徑的話。

obspython模組的obs_property_editable_list_typeobs_property_editable_list_filterobs_property_editable_list_default_path函式,可用於取得可編輯清單方塊控製項的類型,篩選條件以及預設的起始路徑。

obs_property_editable_list_type(p)
obs_property_editable_list_filter(p)
obs_property_editable_list_default_path(p)

p 參數

p參數為清單方塊控製項對應的屬性物件。

如何在 OBS Python 腳本中取得可編輯清單方塊控製項的目前項?

要取得可編輯清單方塊的目前項,你需要使用函式obs_data_get_array讀取清單方塊控製項對應的設定項,然後通過obs_data_array_item取得某個具體項的資料,這些資料對應的 JSON 字串類似於{"value":"Blue","selected":false,"hidden":false}。其中,value表示清單方塊控製項中項的名稱,selected表示該項是否被選取。

下面,為腳本properties.py新增一個可編輯清單方塊my_texts(可編輯清單方塊對應的設定項名稱),用於讓使用者編輯一組文字,在 Python 腳本載入後,task函式會從該組文字中隨機選擇一個然後設定為文字來源的文字。這將涉及與 OBS 資料設定物件和來源相關的函式,由於篇幅限製,我們不再進行說明。

properties.py
# 函式 set_source_text 將隨機選擇清單方塊中的項,然後將其設定為文字來源的文字
def set_source_text(settings):
	# 取得清單方塊中的所有項
	my_texts = obs.obs_data_get_array(settings, 'my_texts')

# 隨機選擇一個項,並將其內容設定為文字來源的文字 count = obs.obs_data_array_count(my_texts) if count > 0: import random index = random.randint(0, count - 1) item = obs.obs_data_array_item(my_texts, index)
# 設定場景中的文字來源 Welcome 的文字 source = obs.obs_get_source_by_name('Welcome') data = obs.obs_data_create() obs.obs_data_set_string(data, 'text', obs.obs_data_get_string(item, 'value')) obs.obs_source_update(source, data) obs.obs_data_release(data) obs.obs_source_release(source)

def script_properties(): # … # 新增一個可編輯清單方塊,用於設定文字來源的文字 obs.obs_properties_add_editable_list(props, 'my_texts', '文字來源文字:', obs.OBS_EDITABLE_LIST_TYPE_STRINGS, None, None) # …
# 執行任務的函式 task def task(): # … # 隨機選擇項作為文字來源的文字 set_source_text(current_settings)

通過 Python 腳本使用群組方塊控製項與 OBS 使用者互動

obspython模組的obs_properties_add_group函式,可用於新增群組方塊控製項,該控製項可包含多個子控製項。

obs_properties_add_group(props, name, description, type, group)

props 參數

props參數為需要新增群組方塊控製項的 OBS 屬性集物件。

name 參數

name參數為群組方塊控製項對應的設定項名稱。

description 參數

description參數為群組方塊控製項的描述資訊。

type 參數

type參數為群組方塊控製項的類型,可使用如下obspython模組變數進行設定,OBS_GROUP_NORMAL表示標準普通群組方塊,OBS_GROUP_CHECKABLE表示擁有核取方塊的群組方塊。

group 參數

group參數為包含所有子控製項資訊的子級屬性集物件(另一個 OBS 屬性集物件)。

obspython模組的obs_property_group_typeobs_property_group_content函式,可用於取得群組方塊控製項的類型和其對應的子級屬性集物件。

obs_property_group_type(p)
obs_property_group_content(p)

p 參數

p參數為群組方塊控製項對應的屬性物件。

如何在 OBS Python 腳本中取得群組方塊控製項的核取方塊選取狀態?

使用函式obs_data_get_bool讀取群組方塊控製項對應的設定項,即可取得群組方塊控製項的核取方塊選取狀態。核取方塊會在群組方塊控製項的類型為OBS_GROUP_CHECKABLE時顯示,用來控製所有子控製項的可用性。

下面,我們為腳本properties.py新增一個群組方塊group_login(群組方塊對應的設定項名稱),他將包含兩個用於填寫登入資訊的文字方塊。

properties.py
def script_properties():
	# …
	# 建立群組方塊對應的屬性集
	login_props = obs.obs_properties_create()
	# 新增一個群組方塊,他包含了用於登入的子控製項
	obs.obs_properties_add_group(props, 'group_login', '使用者登入', obs.OBS_GROUP_NORMAL, login_props)
	obs.obs_properties_add_text(login_props, 'username', '使用者名稱:', obs.OBS_TEXT_DEFAULT)
	obs.obs_properties_add_text(login_props, 'password', '密碼:', obs.OBS_TEXT_PASSWORD)
	# …

通過 Python 腳本取得 OBS 視窗中的控製項

obspython模組提供了以下函式,用於取得 OBS 視窗中的控製項,當然,你也可以認為是取得了屬性物件或屬性集物件。

obs_properties_get函式,可用於取得視窗中的指定控製項,當控製項不存在時,將傳回空值None。需要指出,obs_properties_get可取得群組方塊控製項中的子控製項。

obs_properties_get(props, property)

props 參數

props參數為包含控製項的 OBS 屬性集物件。

property 參數

property參數為控製項對應的設定項名稱。

obs_properties_first函式,可用於取得所有控製項中的第一個,obs_properties_get_parent函式,可用於取得所有子控製項所在的父級控製項(群組方塊控製項)。

obs_properties_first(props)
obs_properties_get_parent(props)

props 參數

props參數為包含所有控製項或子控製項資訊的 OBS 屬性集物件。

下面,為腳本properties.py新增一個登入按鈕login(按鈕對應的設定項名稱),點選該按鈕後,我們會通過obs_properties_get函式取得登入群組方塊控製項,並將其隱藏。

properties.py
# 用於登入的函式 login
def login(props, prop):
	# 點選登入按鈕後,將隱藏群組方塊
	group_login = obs.obs_properties_get(props, 'group_login')
	obs.obs_property_set_visible(group_login, False)
	# 這裏需要傳回特定值 True,否則無法看到隱藏效果
	return True

def script_properties(): # … # 新增一個登入按鈕 obs.obs_properties_add_button(login_props, 'login', '登入', login) # …

通過 Python 腳本移除 OBS 視窗中的控製項

obspython模組的obs_properties_remove_by_name函式,可用於移除視窗中指定的控製項。需要指出的是,該函式可能僅在script_properties函式以及一些控製項的回呼函式或方法中有效。

obs_properties_remove_by_name(props, property)

props 參數

props參數為需要刪除控製項的 OBS 屬性集物件。

property 參數

property參數為刪除控製項對應的設定項名稱。

呼叫 obs_properties_remove_by_name 函式的控製項回呼函式或方法需要傳回 True

如果一個控製項在其回呼函式或方法中,呼叫了obs_properties_remove_by_name函式,那麽回呼函式或方法可能需要傳回特定值True,否則,obs_properties_remove_by_name產生的效果無法立即顯現。

下面,為腳本properties.py新增一個按鈕remove(按鈕對應的設定項名稱),點選之後,我們將通過obs_properties_remove_by_name函式將按鈕移除。

properties.py
# 移除按鈕自身
def remove_myself(props, prop):
	obs.obs_properties_remove_by_name(props, 'remove')
	# 這裏需要傳回特定值 True
	return True

def script_properties(): # … # 新增一個按鈕,點選後將移除自己 obs.obs_properties_add_button(props, 'remove', '移除我自己', remove_myself) # …

使用 OBS 資料設定物件設定 OBS 視窗中控製項的屬性

除了 OBS 使用者直接對視窗中的控製項進行編輯,你還可以使用 OBS 資料設定物件和obs_properties_apply_settings函式對控製項進行修改,由於不能將某個設定項作為參數,因此obs_properties_apply_settings會影響多個控製項。

obs_properties_apply_settings(props, settings)

props 參數

props參數為包含控製項的 OBS 屬性集物件。

settings 參數

settings參數為 OBS 資料設定物件,如果資料設定物件中的項對應了某個控製項,那麽該項的值將更新至控製項。

obspython 模組的 obs_properties_apply_settings 函式不接受自行建立的 OBS 資料設定物件

需要指出的是,你不能自行建立 OBS 資料設定物件,然後將其傳遞給obs_properties_apply_settings函式的settings參數,那不會產生任何效果,視窗中的控製項不會發生變化。

呼叫 obs_properties_apply_settings 函式的控製項回呼函式或方法需要傳回 True

如果一個控製項在其回呼函式或方法中,呼叫了obs_properties_apply_settings函式,那麽回呼函式或方法可能需要傳回特定值True,否則,obs_properties_apply_settings產生的效果無法立即顯現。

在控製項回呼函式或方法中呼叫 obs_properties_apply_settings 函式可能導致無限迴圈

如果通過obs_property_set_modified_callback函式為控製項指定了回呼函式或方法,那麽應盡量避免在回呼函式或方法中呼叫obs_properties_apply_settings,因為這可能導致回呼函式或方法再次被呼叫,從而進入無限迴圈的狀態。

下面,為腳本properties.py新增一個按鈕random_text(按鈕對應的設定項名稱),點選之後,我們將通過obs_properties_apply_settings為之前的訊息文字方塊設定文字。

properties.py
# 讓訊息文字方塊顯示隨機的文字
def set_random_text(props, prop):
	# 隨機的取得一個文字
	import random
	messages = ('天氣不錯!', '吃了嗎?', '下雨啦!')
	text = messages[random.randint(0, 2)]

# 將隨機文字寫入設定項 message obs.obs_data_set_string(current_settings, 'message', text) # 將腳本設定應用到屬性集物件 obs.obs_properties_apply_settings(props, current_settings) # 這裏需要傳回特定值 True return True
def script_properties(): # … # 新增一個按鈕,用於為訊息文字方塊選擇隨機文字 obs.obs_properties_add_button(props, 'random_text', '隨機訊息', set_random_text) # …

程式碼

properties.py·codebeatme/obs-python-scripting·GitHub