输出文字

基本概念

  • LayoutCtl :layout管理器,负责绘制所有元素

  • View : 基础控件,Layout 与 TextView 其实都属于 View

    • Layout : 布局控制器,控制 TextView 显示的位置。 目前支持的Layout有两种 TableLayout(表格布局), TableRow(行布局)

    • TextView : 用于显示文字的view。

显示view

执行下列代码绘制layout

from terminal_layout import *

table = TableLayout('id1', width=Width.fill)

row1 = TableRow('row1')
row1.add_view(TextView('text1', 'hello',fore=Fore.red))

table.add_view(row1)
table.add_view_list([TableRow('row2'), TableRow('row3')])

ctl = LayoutCtl()
ctl.set_layout(table)
ctl.draw()
ctl.stop()

注解

TableLayout,TableRow,TextView的第一个参数是view的id

使用quick init

每次手动创建layout,text_view会很麻烦,这里为 TableRow,TableLayout,LayoutCtl 提供了quick_init()函数帮助快速创建

TableRow

from terminal_layout import *

row = TableRow.quick_init('row1', [TextView('title', 'Title', width=Width.wrap)], width=20,
                          gravity=Gravity.center)

ctl = LayoutCtl(row)
ctl.draw()
ctl.stop()

注解

LayoutCtl()接受的参数是View,因此直接把TableRow放到ctl中。

你也可以把TextView直接放入LayoutCtl(),如:

ctl = LayoutCtl(TextView('title', 'Title', width=10, back=Back.blue))

TableLayout

from terminal_layout import *

row1 = TableRow.quick_init('row1', [TextView('title', 'Title', width=Width.wrap)], width=10,
                           gravity=Gravity.center)

data1_view = TextView('data1', '1.', width=3)
data2_view = TextView('data2', 'foo', width=5)
row2 = TableRow.quick_init('row2', [data1_view, data2_view])

table_layout = TableLayout.quick_init('', [row1, row2], width=10)

ctl = LayoutCtl(table_layout)
ctl.draw()
ctl.stop()

v3.0.0+ data支持 [[TextView]] 这样的形式,且可以通过 row_id_formatter 修改row的默认id。( row_id_formatter 说明见下方 LayoutCtl.quick 部分)

from terminal_layout import *

table = TableLayout.quick_init('root',
                           [ # table id: root
                               [TextView('', '1')], # row id: root_row_0
                               [TextView('', '2')]  # row id: root_row_1
                           ] ,
                           row_id_formatter='{table_id}_row_{index}'
                           )

LayoutCtl

from terminal_layout import *
ctl = LayoutCtl.quick(TableLayout,
                      # table id: root
                      [
                          [TextView('title', 'Title', width=Width.wrap)],  # row id: root_row_0
                          [TextView('data1', '1.', width=3), TextView('data2', 'foo', width=5)],  # row id: root_row_1
                      ],
                      id="root",
                      row_id_formatter='{table_id}_row_{index}'
                      )
ctl.draw()
ctl.stop()

注解

v3.0.0开始,可以通过 id 配置最外层的layout id。

创建 TableLayout 时可通过 row_id_formatter 配置 row id。其支持的展位符如下:

  • table_id :即 id 设置的值

  • index

修改view的属性

  • 使用find_view_by_id获取view并修改(对于重复的id只能获取第一个view)

import time
from terminal_layout import *

ctl = LayoutCtl.quick(TableLayout,
                      [
                          [TextView('title', 'Title')],  # row id: root_row_0
                          [TextView('data1', '1.',width=3), TextView('data2', 'foo',width=5)],  # row id: root_row_1
                      ]
                      )
ctl.draw()

row = ctl.find_view_by_id('root_row_0')
row.set_width(10)
row.set_gravity(gravity=Gravity.center)

time.sleep(0.3)
ctl.find_view_by_id('data1').set_text('2.')

time.sleep(0.3)
ctl.find_view_by_id('data2').delay_set_text('FOO')

ctl.stop()
  • 给layout添加view

from terminal_layout import *

from terminal_layout import *

ctl = LayoutCtl.quick(TableLayout, [])

table = ctl.find_view_by_id('root')
# append
table.add_view(TableRow(''))
table.add_view_list([TableRow(''), TableRow('')])

# insert 用法和list相同
table.insert(3, TableRow(''))

注解

因为 TextView 也属于 View ,因此你可以把 TextView 加入 TableLayout 中而不报错。 如:

table = TableLayout('id1')
table.add_view(TextView('', 'text'))

这样某些情况下做相当于

table = TableLayout('id1')
row = TableRow.quick_init('', [TextView('', 'text') ] )
table.add_view(row)

但第一种方式将不能正确处理某些 TextView 的自有属性(非基础 View 的属性)。 除非你知道你在做什么,否则建议使用第二种方式。

移除view

  • 你可以使用remove或remove_view_by_id移除view

from terminal_layout import *
ctl = LayoutCtl.quick(TableLayout,
                      # table id: root
                      [
                          [TextView('title', 'Title', width=Width.wrap)],  # row id: root_row_0
                          [TextView('data1', '1.', width=3), TextView('data2', 'foo', width=5)],  # row id: root_row_1
                      ]
                      )
# remove title
ctl.remove_view_by_id('title')

自动刷新

v2开始会启动线程自动刷新,因此结束程序时必须手动调用stop()。

如果你不需要,则设置 auto_re_draw为False 禁用,此时你需要手动调用re_draw()

from terminal_layout import *

ctl = LayoutCtl(TextView('title', 'Title', width=10))
ctl.draw(auto_re_draw=False)
time.sleep(0.5)
ctl.find_view_by_id('title').set_fore(Fore.red)

ctl.re_draw()

注解

如果禁用了自动刷新,delay_set_text()函数就无效了

View的属性

View的属性包括: width , visibility , gravity

TextView在上述基础上增加了:text , back , style , fore , weight , weight ,

关于属性的说明参照:属性效果说明