如何通过 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)
# …