如何通過 Python 腳本使用控製項與 OBS 使用者互動?OBS 屬性集物件介紹
本節中的“設定項”是指 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_description
和obs_property_set_description
函式,用於取得和設定控製項的描述資訊,對於按鈕控製項來說,描述資訊等同於按鈕控製項上顯示的文字。
obs_property_description(p)
obs_property_set_description(p, description)
- description 參數
description
參數為控製項的描述資訊。
obs_property_visible
和obs_property_set_visible
函式,用於取得和設定控製項是否可見,即控製項是顯示的還是隱藏的。
obs_property_visible(p)
obs_property_set_visible(p, visible)
- visible 參數
visible
參數為True
時,將設定控製項可見,為False
時,將設定控製項隱藏。
obs_property_enabled
和obs_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_INVALID
,OBS_PROPERTY_BOOL
,OBS_PROPERTY_INT
,OBS_PROPERTY_FLOAT
,OBS_PROPERTY_TEXT
,OBS_PROPERTY_PATH
,OBS_PROPERTY_LIST
,OBS_PROPERTY_COLOR
,OBS_PROPERTY_BUTTON
,OBS_PROPERTY_FONT
,OBS_PROPERTY_EDITABLE_LIST
,OBS_PROPERTY_FRAME_RATE
,OBS_PROPERTY_GROUP
,OBS_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_description
,obs_property_set_visible
,obs_property_set_enabled
函式,那麽回呼函式或方法可能需要傳回特定值True
,否則,產生的效果將無法顯現。
OBS obspython 模組提供的關於控製項的通用函式在一些情況下是無效的
obspython
模組所提供的關於控製項的通用函式,在有些情況下是無效的,比如在 Python 腳本定義的script_update
函式中,呼叫obs_property_set_visible
或obs_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
中,我們將根據核取方塊的選取狀態(對應的設定項的值)來決定是否執行任務。
# 匯入模組 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_int
和obs_properties_add_int_slider
函式,可用於新增表現為整數的微調方塊和滑桿控製項,obs_properties_add_float
和obs_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_limits
和obs_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_min
,obs_property_int_max
,obs_property_int_step
,obs_property_int_type
,obs_property_float_min
,obs_property_float_max
,obs_property_float_step
,obs_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_suffix
,obs_property_float_suffix
,obs_property_int_set_suffix
,obs_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_int
或obs_data_get_float
讀取控製項對應的設定項的值,來完成該目標。
下面,我們為腳本properties.py
新增一個滑桿delay
(滑桿對應的設定項名稱),用於控製任務函式task
的延遲執行時間,其預設值為1.5
(通過指定設定項的預設值)。
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
輸出至指令稿記錄視窗。
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_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_type
和obs_property_list_format
函式,可用於取得下拉式方塊控製項的類型和格式。
obs_property_list_type(p)
obs_property_list_format(p)
- p 參數
p
參數為下拉式方塊控製項對應的屬性物件。
obspython
模組的obs_property_list_add_string
,obs_property_list_add_int
,obs_property_list_add_float
,obs_property_list_insert_string
,obs_property_list_insert_int
,obs_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_count
,obs_property_list_item_name
,obs_property_list_item_string
,obs_property_list_item_int
,obs_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_disabled
和obs_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_int
,obs_data_get_float
或obs_data_get_string
讀取控製項對應的設定項的值,來完成該目標,他們對應了目前選取項的值。
下面,我們為腳本properties.py
新增一個下拉式方塊platform
(下拉式方塊對應的設定項名稱),用於讓使用者選擇串流平臺,選擇的結果(對應的設定項的值)將被函式task
輸出至指令稿記錄視窗。
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_type
,obs_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
函式將被呼叫兩次(事實上,應該避免這種可能導致無限迴圈的做法)。
# 函式 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_color
和obs_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
的文字來源,色彩對話方塊的預設色彩,可能會讓文字來源無法被清晰分辨。
# 函式 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
的文字來源,字型對話方塊的預設字型,可能會讓文字來源無法被清晰分辨。
# 函式 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_type
,obs_property_editable_list_filter
,obs_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 資料設定物件和來源相關的函式,由於篇幅限製,我們不再進行說明。
# 函式 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_type
和obs_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
(群組方塊對應的設定項名稱),他將包含兩個用於填寫登入資訊的文字方塊。
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
函式取得登入群組方塊控製項,並將其隱藏。
# 用於登入的函式 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
函式將按鈕移除。
# 移除按鈕自身
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
為之前的訊息文字方塊設定文字。
# 讓訊息文字方塊顯示隨機的文字
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)
# …