URLhttps://learnscript.net/zh-hant/obs-python-scripting/properties/
    複製連結移至說明  範例

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

    閱讀 47:36·字數 14281·更新 
    Youtube 頻道
    訂閱 375

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

    OBS 屬性集物件

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

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

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

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

    資料設定

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

    建立和終結 OBS 屬性集物件

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

    obs_properties_create()

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

    obs_properties_destroy(props)

    props 參數

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

    取得和設定 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參數為指定的回呼函式或方法,回呼函式和方法應該具有三個參數,分別是控製項所在的屬性集物件,控製項對應的屬性物件,以及屬性集物件對應的資料設定物件。

    盡量通過 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,否則,產生的效果將無法顯現。

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

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

    使用核取方塊控製項

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

    obs_properties_add_bool(props, name, description)

    props 參數

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

    name 參數

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

    description 參數

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

    如何取得核取方塊控製項的選取狀態?

    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 腳本使用微調方塊,滑桿控製項

    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參數為需要新增微調方塊或滑桿控製項的屬性集物件。

    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 並沒有提供直接取得微調方塊或滑桿控製專案前數值的函式,但你可以通過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] 工作開始了

    使用文字方塊控製項

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

    obs_properties_add_text(props, name, description, type)

    props 參數

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

    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 並沒有提供直接取得文字方塊文字的函式,但你可以通過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] 訊息為 [空]

    使用按鈕控製項

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

    obs_properties_add_button(props, name, text, callback)

    props 參數

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

    name 參數

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

    text 參數

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

    callback 參數

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

    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] 訊息為 [空]

    使用下拉式方塊控製項

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

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

    props 參數

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

    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 並沒有提供直接取得下拉式方塊目前選取項的函式,但你可以通過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 腳本使用檔案對話方塊,資料夾對話方塊控製項

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

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

    props 參數

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

    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 並沒有提供直接取得檔案或資料夾對話方塊目前路徑的函式,但你可以通過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) # …

    使用色彩對話方塊控製項

    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參數為需要新增色彩對話方塊控製項的屬性集物件。

    name 參數

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

    description 參數

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

    如何取得色彩對話方塊控製項的目前色彩?

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

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

    要使下面的範例得以執行,場景應具有名稱為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)

    使用字型對話方塊控製項

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

    obs_properties_add_font(props, name, description)

    props 參數

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

    name 參數

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

    description 參數

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

    如何取得字型對話方塊控製項的目前字型?

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

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

    要使下面的範例得以執行,場景應具有名稱為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)

    使用可編輯清單方塊控製項

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

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

    props 參數

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

    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_data_get_array讀取清單方塊控製項對應的設定項,然後通過obs_data_array_item取得某個具體項的資料,這些資料對應的 JSON 字串類似於{"value":"Blue","selected":false,"hidden":false}。其中,value表示清單方塊控製項中項的名稱,selected表示該項是否被選取。

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

    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)

    使用群組方塊控製項

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

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

    props 參數

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

    name 參數

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

    description 參數

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

    type 參數

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

    group 參數

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

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

    obs_property_group_type(p)
    obs_property_group_content(p)

    p 參數

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

    如何取得群組方塊控製項的核取方塊選取狀態?

    使用函式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)
    	# …

    取得 OBS 視窗中的控製項

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

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

    obs_properties_get(props, property)

    props 參數

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

    property 參數

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

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

    obs_properties_first(props)
    obs_properties_get_parent(props)

    props 參數

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

    下面,為腳本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) # …

    移除 OBS 視窗中的控製項

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

    obs_properties_remove_by_name(props, property)

    props 參數

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

    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_properties_apply_settings函式對控製項進行修改,由於不能將某個設定項作為參數,因此obs_properties_apply_settings會影響多個控製項。

    obs_properties_apply_settings(props, settings)

    props 參數

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

    settings 參數

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

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

    需要指出的是,你不能自行建立資料設定物件,然後將其傳遞給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