应用支持

选项和选项列表

一个常见问题就是显示一个选项列表给用户. 在简单应用中, 为了这个目的可能会用一个自定义设计的窗口, 但是很多任务中自动生成的窗口会更合适. 一个支持该特性的 实验性的 系统在 2.0pre84 版本被引入.

这个系统的核心是 Option 对象的概念. 这些对象根据它们的类型,要么存放单一值,要么存放值列表, 同时与待定选项相关的所有文档应该也会展示给用户. 选项对象是用下面的参数创建的: OptionType(name, value=None, documentation=None, short_explanation=None, option_widget_keywords = None, default = None). short_explanation 参数当前还没有在默认控件中使用, 但是会在未来的版本中被使用. 选项对象被设计成可让用户从也可能是由 choices 参数创建的有限的选项中进行选择.

所有的选项类也都有 DEFAULT 和 WIDGET_TO_USE 类属性. 如果默认值还没被定义的话,前者会定义默认值. 第二个定义了让用户来调节待定选项的控件的类.

下面是当前版本定义的选项类: OptionFreeText, OptionSingleChoice, OptionMultiChoice, OptionMultiFreeList, OptionBoolean, OptionFilename, OptionDate, OptionMultiFreeText. 存到 option 对象的值都应该用 set(value) 方法设定, 用 get() 方法获取. 所有的选项类也都定义了一个可被重写的 when_set 方法, 而它会在值被修改之后调用. 允许用户从一系列的有限项作选择的选项类还有 setChoices(choices)getChoices 方法.

选项列表可以使用 OptionListDisplay 控件来显示. 它接收选项列表当作其 OptionListDisplay 属性的值. 如果某个选项被选中, 一个给用户显示文档(如果有的话)的窗口会展示给用户并让用户改变它的值.

选项集合可以用一个 OptionList 对象合在一起. OptionList 类有一个 options 属性. 它只是一个列表, 选项对象可能被被加进来. 未来的版本可能会定义一个不一样的API. OptionList 对象的目的帮助保存和恢复选项集合到文件中的. 这些文件的格式是一个自定义的文本格式, 类似于标准的 Unix 文件, 但是可以存储和恢复字符串列表 (使用 tab[制表符] 作为分隔符). 这个格式还在演进,并可能未来的版本中被改变. 只有和默认值不同的值会被存下来.

OptionList 对象的创建可以带 filename 参数, 它有 write_to_file(fn=None)reload_from_file(fn=None) 方法.

SimpleOptionForm 类是一个设计用来展示这些元素如何运作的窗口. OptionListDisplay 控件作为一个名为 wOptionList 的属性被创建.

示例 代码

下面简短的 demo 程序会在调用中存储选定的选项到文件 ‘/tmp/test’

#!/usr/bin/env python
# encoding: utf-8

import npyscreen
class TestApp(npyscreen.NPSApp):
    def main(self):
        Options = npyscreen.OptionList()

        # 为了方便让我们不用不停的写 Options.options
        options = Options.options

        options.append(npyscreen.OptionFreeText('FreeText', value='', documentation="This is some documentation."))
        options.append(npyscreen.OptionMultiChoice('Multichoice', choices=['Choice 1', 'Choice 2', 'Choice 3']))
        options.append(npyscreen.OptionFilename('Filename', ))
        options.append(npyscreen.OptionDate('Date', ))
        options.append(npyscreen.OptionMultiFreeText('Multiline Text', value=''))
        options.append(npyscreen.OptionMultiFreeList('Multiline List'))

                try:
                Options.reload_from_file('/tmp/test')
        except FileNotFoundError:
                        pass

        F  = npyscreen.Form(name = "Welcome to Npyscreen",)

        ms = F.add(npyscreen.OptionListDisplay, name="Option List",
                values = options,
                scroll_exit=True,
                max_height=None)

        F.edit()

        Options.write_to_file('/tmp/test')

if __name__ == "__main__":
    App = TestApp()
    App.run()