Skip to content
LTaoist edited this page Apr 30, 2012 · 2 revisions

这个页面主要介绍了UI模块和g模块的用法。

UI

UI模块其实直接继承了Frame。你完全可以定义自己的UI。

如果觉得直观上很难接受,那么不妨把一个Frame看成是几个子Frame的叠加……或者,不需要管它继承什么。

你需要为UI定义initialize,fetch和get,如果有需要,可以定义clear。

from chaofeng.g import _u

class TextInput(Frame):
    '''用于输入的UI。'''

    def initialize(self,max_len=100):
        ''' 新建一个TextInput,设置buf区。'''
        self.buffer = []
        self.buffer_size = max_len

    def fetch(self):
        ''' fetch用于取出最后的结果。 '''
        return _u(''.join(self.buffer))

    def clear(self):
        ''' 结束时清空buf。'''
        self.buffer = []

    def get(self,data):
        ''' 处理字符。 '''
        c = data[0]
        if c == theNULL: return
        elif data == k_backspace or data == k_del : # 删除键
            if self.buffer : # 未空
                p = self.buffer.pop()  # 删除最后一个字符
                if p >= u'\u4e00' and p <= u'\u9fa5' :# 如果是中文
                    dd = movex(-2) # 后退两格
                    self.write("%s  %s" % (dd,dd))
                else: # 英文
                    dd = movex(-1)
                    self.write("%s %s" % (dd,dd)) # 后退一格
            return
        elif ord(c) >= 32 and c != IAC: # 其他字符
            try:
                self.buffer.extend(list(data.decode('gbk'))) # 解码并保存
                self.write(data)  #输出到屏幕
            except UnicodeDecodeError:
                pass

不应该直接实例化一个UI,应该是sub方法。

在交换上,还可以使用read_until方法(如果有必要的话)。read_until接收的data会同时传递给Frame。

from chaofeng import Frame
from chaofeng.ui import TextInput

class EgFrame(Frame):

    def initialize(self):
        self.text = self.sub(TextInput) # sub(subFrame,*args,**kwargs)
        print self.text.read_until()    # read_until(termitor=['\r','\n','\r0'])

    def get(self,data):
        self.text.get(data)

g

g模块主要用来处理一些全部变量和相关设定。

mark

mark是一个变量,建议你用来记录每个Frame 。它很像flask里面的route。

from chaofeng.g import mark
from chaofeng import Frame

@mark('main') # mark EggFrame as 'main'
class EggFrame(Frame): pass

@mark('test')
class TestFrame(Frame):
    def initialize(self):
        self.goto(mark['main']) # mark['main'] is EggFrame 

mark没有提供任何新的功能,完全就是一个糖果。

static

chaofeng会自动导入工作目录下面的static文件夹中的文件。有四种格式:

  1. .seq 将会将里面的内容读入,每行分开,保存为一个列表。
  2. .txt 将会将里面的内容全部保存为一个字符串
  3. .tpl 将会将里面的内容实例化为一个string.Templete对象,并且忽略 ----以前的全部内容(类似于注释)。
  4. .ani 将会将里面的内容实例化为一个数组,用Animation的UI。

比如有一个文件

This is comment
----
This is the content.

如果这个文件保存为 t.seq t.txt t.tpl 那么 static['t'] 的值将分别是:

['This is comment','----','This is the content.']

'This is comment\r\n----\r\nThis is the content.'

<string.Template object at 0x7f123f199cd0> # safe

其中 Template.substitute 的值是This is the content.

Clone this wiki locally