forked from wizardcypress/chaofeng
-
Notifications
You must be signed in to change notification settings - Fork 0
UI and g
LTaoist edited this page Apr 30, 2012
·
2 revisions
这个页面主要介绍了UI模块和g模块的用法。
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模块主要用来处理一些全部变量和相关设定。
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没有提供任何新的功能,完全就是一个糖果。
chaofeng会自动导入工作目录下面的static文件夹中的文件。有四种格式:
-
.seq
将会将里面的内容读入,每行分开,保存为一个列表。 -
.txt
将会将里面的内容全部保存为一个字符串 -
.tpl
将会将里面的内容实例化为一个string.Templete对象,并且忽略 ----以前的全部内容(类似于注释)。 -
.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.