如何通过 Python 脚本使用控件与 OBS 用户交互?OBS 属性集对象介绍

我被代码海扁署名-非商业-禁演绎
阅读 46:54·字数 14073·发布 
Bilibili 空间
关注 960

本节中的“设置项”是指 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