捐赠支持塞班原创作品 | dospy智能手机网新改版 | 智能手机软件下载频道新上线! | 手机访问:wap.dospy.com |




站内全文搜索,由谷歌和塞班合作提供
站内全文搜索,由百度和塞班合作提供

 
标题: ------教程-----iPro7中关于模版管理的源代码分析
563255107
排长
Rank: 3Rank: 3


UID 9780224
精华 0
积分 291
帖子 291
威望 0 点
财富值 370 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 10
注册 2009-5-23
手机型号 
状态 离线
 
发表于 2011-4-1 17:18  资料  个人空间  短消息  加为好友 
------教程-----iPro7中关于模版管理的源代码分析

大家好我是小马,前面我分析了有关数据库和文件管理器2的源代码分析,今天我来给大家分析下模版管理的源代码
======================教程开始================================
class Mould(object, ) :#模块管理,用过iPro7的应该都知道吧


    __module__ = __name__
    def __init__(s, dir, pos_dir):#仍然是初始化操作,这里提供了两个参数一个是存储模块的路径,一个是存储模块光标路径的
        s.dir = dir
        s.pos_dir = pos_dir
        if  not (os.path.isdir(dir)) : #如果这个路径不存在就创建这个路径
            try :
                os.makedirs(dir)
            except :
                ui.note(zw('模板功能出错'), 'error')
            pass
        if  not (os.path.isdir(pos_dir)) : #如果这个路径不存在就创建这个路径
            try :
                os.makedirs(pos_dir)
            except :
                ui.note(zw('模板功能出错'), 'error')
            pass




    def _add_mould(s): #添加模块
        ask_mould = file_manager.AskFile(ext = ['.py', '.txt'], dirs = eval(db['work_dirs']), multi = False)#调用文件浏览函数浏览要添加的模块,这里的ext为后缀限制,dirs为默认打开的路径,你会问了为什么要使用eval呢,有什么作用?eval() 函数通常用来执行一条包含返回值的表达式,这里是返回我们设置的工作目录,其中db['work_dirs']得到的是一个字符串,经过eval函数之后就变成了py可执行的代码,要不然会出错的
        if ask_mould == [] : #如果用户选择了取消,直接返回
            return None
        ask_mould = ask_mould[0] #这里不知道为何这么写,不过这不影响程序的运行,我感觉去掉这一句没什么问题,现在得到的ask_module是一个文件路径
        mould_path = zw(s.dir) + (u'%s.py' % zw(os.path.splitext(os.path.basename(ask_mould))[0]))#使用os.path.basename(ask_mould)得到文件名有后缀的,然后用os.path.splitext(os.path.basename(前面得到的文件名))[0]得到文件的文件名没有后缀
        while True :
            if os.path.exists(en(mould_path)) : #如果想要添加的模块已经有相同的名字,弹出对话框询问用户如何执行
                ask_cover = ui.popup_menu([zw('重命名'), zw('覆盖')], zw('同名模板已存在'))
                if ask_cover is None : #用户选择取消直接返回
                    return None
                elif ask_cover == 0 : #用户选择重命名,弹出对话框提示用户输入新的名字
                    name = ui.query(zw('模板名'), 'text')
                    if name is None : #如果没有重命名而选择了取消,就直接返回退出while循环
                        return None
                    mould_path = s.dir + name + u'.py'  #更新moudle_path为重命名后的路径
                else :  #如果用户选择了覆盖,直接退出while因为程序本来就会直接覆盖写入的
                    break
                pass
            else : #如果没有存在相同的文件直接退出while循环,复制选择的模块到我们定义的模块文件夹里
                break
        try :
            e32.file_copy(mould_path, ask_mould) #调用e32模块里的file_copy函数进行文件的复制
            s.mould_list.insert(0, os.path.splitext(os.path.basename(mould_path))[0]) #在s.mould_list列表里插入我们刚才选择的模块
            s.lb.insert(0, ui.Item(s.mould_list[0])) #在我们看到的模块列表里插入我盟刚才添加的模块
            s.lb.set_current(0) #把光标定位到第一个模块
        except :
            ui.note(zw('无法添加'), 'error')




    def _edit_pos(s): #编辑光标位置
        try :
            f = open(s.dir + en(s.lb.current_item().__dict__['title']) + '.py') #使用s.lb.current_item().__dict__['title']来得到当前模块的名字不含后缀,这个是文件是模块
            try :
                length = len(f.read().decode('u8')) #得到这个模块文件的总长度
            finally :
                f.close() #关闭打开的文件,减少内存的占用等
        except :
            ui.note(zw('模板错误'), 'error') #如果打开失败提示用户并返回
            return None
        try :
            f = open(s.pos_dir + en(s.lb.current_item().__dict__['title']) + '.py') #使用s.lb.current_item().__dict__['title']来得到当前模块的名字不含后缀,这个文件是保存我们设定的模块里的光标的文件
            try :
                old_pos = int(f.read()) #使用内置函数int把读取的数值转换为int型
            finally :
                f.close() #关闭文件
        except : #如果读取出错把光标位置 默认设置为文件的长度
            old_pos = length
        ask = ui.query(zw('光标位置'), 'number', old_pos) #询问用户设定光标的位置
        if ask is None : #如果取消直接返回
            return None
        elif ask > length : #如果用户输入的值比文件的长度还要长,默认置为文件长度
            ask = length
            ui.note(zw('光标位置超出模板长度,已自动更改为模板长度'))
        try : #打开存放模版光标位置的文件,并把刚才用户输入的值写入,进行更新
            f = open(s.pos_dir + en(s.lb.current_item().__dict__['title']) + '.py', 'w')
            try :
                f.write(str(ask)) #这里得到的ask是int型的我们要转换成str字符串型材可以写入的
            finally :
                f.close()
        except :
            ui.note(zw('无法保存设置'), 'error')




    def _edit(s): #编辑模版
        try :
            f = open(s.dir + en(s.lb.current_item().__dict__['title']) + '.py') #打开模版文件
        except :
            ui.note(zw('无法打开编辑'), 'error')
            return None
        try :
            try :
                fr = f.read().decode('u8').replace(u'\r\n', u'\n') #读取模版中的内容,并使用'\n'替换'\r\n'换行,注意这里也是我们第一次读取到的内容,后面我们会用到的,这里你会有疑问,"\r\n"是什么,注意:unicode中的换行是"\r\n" 前面我们不是使用了decode("u8")把读到的u8编码的内容转换成unicode编码,然后用"\n" 替换"\r\n"
            finally :
                f.close()
        except :
            ui.note(zw('无法打开编辑'), 'error')
            return None


        old_title = ui.app.title #保存原来的标题
        old_menu = ui.app.menu  #保存原来的菜单项
        old_exit_key = ui.app.exit_key_handler #保存原来的退出键功能
        old_body = ui.app.body #保存原来的程序主界面
        def edit_pos(): #设定光标位置
            try :
                f = open(s.pos_dir + en(s.lb.current_item().__dict__['title']) + '.py', 'w') #打开光标文件
                try :
                    f.write(str(w.get_pos())) #默认取得当前光标的位置并写入光标文件中
                    ui.note((zw('光标位置已更改为\n%d') % w.get_pos()), 'conf')
                finally :
                    f.close()
            except :
                ui.note(zw('无法保存设置'), 'error')




        def back(ask = True): #
            if ask and w.get() != initial : #这里的initial是我上面提到过的第一次读取到的内容,这句是判断用户是否进行了修改
                ask_save = ui.popup_menu([zw('保存'), zw('取消')], zw('文件已修改')) #如果用户进行了改动,退出的时候提示用户是否保存修改
                if ask_save is None :  #如果用户取消直接返回
                    return None
                elif ask_save == 0 : #如果用户选择保存,打开文件并把修改后的内容写入文件中
                    try :
                        f = open(s.dir + en(s.lb.current_item().__dict__['title']) + '.py', 'w')
                    except :
                        ui.note(zw('无法保存'), 'error')
                        return None
                    try :
                        f.write(w.get().replace(u'\u2029', u'\n').encode('u8')) #这里又会有疑问,"\u2029"是什么东西,别着急我们从程序总读到的内容是Python的源码,而在python中默认的换行就是"\u2029",unicode默认的换行是"\r\n"  而u8的换行标志是"\n" 这下子就不会乱了吧
                        f.close()
                    except :
                        ui.note(zw('文件错误'), 'error')
                        return None
                    pass
                pass
            ui.app.title = old_title #还原原来的标题
            ui.app.body = old_body  #还原原来的程序主体
            ui.app.menu = old_menu  ##还原原来的菜单项
            ui.app.exit_key_handler = old_exit_key  ##还原原来的退出键功能
            ui.app.body.bind(8, s._del_mould)  #设置快捷方式,删除键为删除功能,bind也就是绑定的意思喽


        ui.app.title = s.lb.current_item().__dict__['title'] #设定编辑界面下的标题为当前选择列表中的标题
        ui.app.body = w = ui.Text()  #设定标记界面下的程序主题为Text()界面
        initial = fr.replace(u'\n', u'\u2029')  #文件的初始化读取到的内容应该是Python的源代码,也就是说换行标志是"\u2029"
        try :
            w.set(fr) #把读取到的内容输出到屏幕上
        except :
            ui.note(zw('无法打开编辑'), 'error')
            back(ask = False) #如果打开失败了,把ask设置为False在选择返回的时候就不会询问用户是否保存了
            return None
        ui.app.menu = [(zw('设定光标'), edit_pos), (zw('返回'), back)] #设置编辑界面的菜单项
        ui.app.exit_key_handler = back #设置编辑界面下的退出键的功能,这样避免与主界面的退出键的功能发生冲突




    def _rename(s):  #对模版进行重命名
        ask = ui.query(zw('重命名'), 'text', s.lb.current_item().__dict__['title']) #询问用户输入新的名字
        if ask is None : #如果用户选择取消,直接返回
            return None
        try :  #如果用户输入了新的名字,调用os模块的rename函数进行重命名功能
            os.rename(s.dir + en(s.lb.current_item().__dict__['title']) + '.py', s.dir + en(ask) + '.py') #注意这里的rename里有两个参数,第一个是源文件的名字,第二个是我们想要改成的目标文件的名字
            try :
                os.rename(s.pos_dir + en(s.lb.current_item().__dict__['title']) + '.py', s.dir + en(ask) + '.py') #上面我们只是修改了模块的名字,记得我们还有模块光标文件的名字没有修改,这个是修改光标文件的名字的
            except :
                pass
        except :
            ui.note(zw('无法重命名'), 'error')
            return None
        s.lb.current_item().__dict__['title'] = ask  #上面的语句只是更改了文件的名字,这里是修改我们看到的列表的名字
        s.lb[s.lb.current()] = s.lb[s.lb.current()]  #刷新当前光标所在的列表显示,(也就是我们刚才重命名的那个列表行)




    def _del_mould(s):  #删除模版
        if len(s.lb) == 0 :  #如果一个模版也没有直接返回
            return None
        index = s.lb.current() #获取当前光标所在的列表,也就是想要删除的列表
        if ui.query((zw("删除\n'%s'?") % s.mould_list[index]), 'query') : #删除s.mould_list中我们选中的那个模版
            try :
                os.remove(s.dir + en(s.mould_list[index] + u'.py'))  #这里执行删除模块任务
                try :
                    os.remove(s.pos_dir + en(s.mould_list[index] + u'.py'))  #这里执行删除模块相应的光标文件的任务
                except :
                    pass
                if index == (len(s.lb) - 1) : #如果要删除的是列表里的最后一个
                    s.lb.set_current((index - 1)) #把光标移动到刚才删除的模块的前面,也就是现在的列表的最后一个
                del s.lb[index]  #执行删除任务,
                del s.mould_list[index]  #删除s.module_list里的那个项目
            except :
                ui.note(zw('无法删除'), 'error')
            pass




    def _del_all_mould(s):  #删除所有模版
        if ui.query(zw('删除所有模板?'), 'query') : #询问用户是否全部删除
            new_mould_list = [] #新建一个列表new_module_list来保存删除异常的模版
            for m in s.mould_list:  #依次遍历s.module_list里的文件
                try :
                    os.remove(s.dir + en(m + u'.py')) #尝试删除
                except :
                    ui.note((zw("无法删除\n'%s'") % m), 'error')
                    new_mould_list.append(m) #出现异常无法删除后把无法删除的模版保存到我们新建的new_module_list列表里
            del s.mould_list[:] #删除全部模版
            s.mould_list.extend(new_mould_list) #现在用s.module_list保存着无法删除后的模版
            del s.lb[:] #清空s.lb列表
            s.lb.extend([ui.Item(x) for x in s.mould_list])  #现在s.lb里保存这无法删除后的模版




    def manager(s, back_callback): #管理模版
        s.lb = ui.Listbox2([]) #创建一个列表,不过这个列表是appuifw2里面的Listbox2实例,目前我还不是很理解,如果有懂的麻烦给解释下哈
        s.mould_list = [zw(os.path.splitext(x)[0]) for x in os.listdir(s.dir)] #用s.mould_list来保存模版路径下的模版文件名列表,我认为应该是一个中间变量,方便我们使用创建的
        s.lb.extend([ui.Item(x) for x in s.mould_list]) #列出所有的模版
        ui.app.body = s.lb #设置模版管理界面的主体是列表
        ui.app.title = zw('模板管理')
        ui.app.body.bind(8, s._del_mould) #设置快捷键,删除键为删除功能
        ui.app.exit_key_handler = back_callback #设置退出键为传进来的参数函数,这个功能在program类里面有空我会写那个分析的
        ui.app.menu = [(zw('添加'), s._add_mould), (zw('编辑'), s._edit), (zw('光标'), s._edit_pos), (zw('重命名'), s._rename), (zw('删除'), s._del_mould), (zw('清空'), s._del_all_mould)]  #设置模块管理界面的菜单项



#今天的分析就到这里了,好吧就到这里吧,有疑问的还是请跟帖或者邮箱等


[ 本帖最后由 563255107 于 2011-4-1 17:20 编辑 ]

评分次数:1 次  财富值: +10     

本帖最近 评分/打赏 记录
♂天涯一角   2011-4-1 17:40  财富值  +10    感谢分享




[fly]小马专用[/fly]
顶部
♂天涯一角 (请辞了~)
荣誉会员
Rank: 12Rank: 12Rank: 12
( DDC预备队)角度决定视野!


塞班元勋奖  
UID 12633588
精华 0
积分 14710
帖子 14710
威望 89 点
财富值 30656 塞班币
贡献值 15 点
好评度 109 点
交易信用 0 点
原创小红花 29 朵
人气值 229 点
阅读权限 60
注册 2009-10-1
手机型号  Android/Symbian
来自 内蒙古(现在湖北)
状态 离线
 
发表于 2011-4-1 17:41  资料  个人空间  短消息  加为好友 
好东西,欢迎分享有时间慢慢学习下

[ 本帖最后由 ♂天涯一角 于 2011-4-1 17:46 编辑 ]





【最新出品】MBTI权威职业测试最新版☜点此下载
追心之所向,持久坚持...为了明天,继续奋斗...

顶部
zyymydos
连长
Rank: 4


UID 17554079
精华 0
积分 417
帖子 417
威望 0 点
财富值 455 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 15
注册 2010-4-4
手机型号 
状态 离线
 
发表于 2011-4-1 19:13  资料  个人空间  短消息  加为好友 
强烈支持!
楼主辛苦了。

顶部
真.天舞
dospy DDC团队
Rank: 11Rank: 11Rank: 11Rank: 11
唯战,无它


原创文章奖  
UID 277359
精华 0
积分 1669
帖子 1669
威望 58 点
财富值 6012 塞班币
贡献值 0 点
好评度 66 点
交易信用 0 点
原创小红花 69 朵
人气值 20 点
阅读权限 50
注册 2006-7-1
手机型号  糯鸡鸭-恩扒两
状态 离线
 
发表于 2011-4-1 19:30  资料  个人空间  短消息  加为好友 
不错 支持解析源码





顶部
■屁屁■
军长
Rank: 9Rank: 9Rank: 9


UID 23171899
精华 0
积分 4044
帖子 4044
威望 5 点
财富值 1381 塞班币
贡献值 31 点
好评度 6 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 45
注册 2010-10-1
手机型号 
状态 离线
 
发表于 2011-4-1 22:41  资料  个人空间  短消息  加为好友 
我支持一下!





想加入我们吗,那就赶快行动吧!

※遇到问题请善于搜索功能!
※问题已解决请编辑标题标注已解决!
原来一切都是为了别人,最后还没有好的下场!
善于搜索你也是高手!问题不在那么难!
顶部
jijijilelele
团长
Rank: 6Rank: 6


UID 17085992
精华 0
积分 906
帖子 906
威望 0 点
财富值 1120 塞班币
贡献值 0 点
好评度 2 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 30
注册 2010-3-20
手机型号 
状态 离线
 
发表于 2011-4-2 01:19  资料  个人空间  短消息  加为好友 
强烈支持!!!!!
论坛有你更精彩!!!!!





顶部
zhangnaiwei
班长
Rank: 2



UID 17370793
精华 0
积分 50
帖子 50
威望 0 点
财富值 36 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 10
注册 2010-3-29
手机型号 
状态 离线
 
发表于 2011-4-26 09:11  资料  个人空间  短消息  加为好友 
打了那么多字,楼主辛苦了,强烈支持!

顶部
ljm218
排长
Rank: 3Rank: 3



UID 2941318
精华 0
积分 100
帖子 100
威望 0 点
财富值 121 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 10
注册 2008-2-9
手机型号  3230
来自 湖南
状态 离线
 
发表于 2011-5-22 19:14  资料  个人空间  短消息  加为好友  QQ
iPro7_v2.0.8_fina.扩展反编辑 提示模块错误


iPro7_v2.0.8_fina.扩展反编辑  提示模块错误
Traceback (most recent call last):
  File "C:\Private\00001eff\iPro7.py", line 918, in execute_extend
  File "C:\System\iPro7\Extend\iPro7_compile.py", line 27, in tools
  File "C:\System\iPro7\Extend\iPro7_compile.py", line 95, in decompile_to_py
ImportError: No module named dialog

我用在线翻译_有道翻译 如下:


回溯(最近一次调用最后一个):
  文件“C:\私人\ 00001eff \ iPro7.py”,行918 execute_extend,
  文件“C:\系统\ iPro7 \扩展\ iPro7_compile.py”,第27行的工具,
  文件“C:\系统\ iPro7 \扩展\ iPro7_compile.py”,95行,在decompile_to_py
的ImportError:命名对话框没有模块


我装了1.45增强版的PY平台 decompile2.v0.3.5正式版也装了
请问是什么原因?

顶部
563255107
排长
Rank: 3Rank: 3


UID 9780224
精华 0
积分 291
帖子 291
威望 0 点
财富值 370 塞班币
贡献值 0 点
好评度 0 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 10
注册 2009-5-23
手机型号 
状态 离线
 
发表于 2011-5-22 20:39  资料  个人空间  短消息  加为好友 
请卸载了原来的iPor7重新安装,还有就是查看你的c/e:resources/文件夹里是否有dialog.py这个文件,你是怎么产生这个错误的?反编译ipro7?吗





[fly]小马专用[/fly]
顶部
ㄗs℡Cool_濠
dospy DDC预备队
Rank: 10Rank: 10Rank: 10


UID 24622030
精华 0
积分 492
帖子 492
威望 4 点
财富值 1667 塞班币
贡献值 0 点
好评度 7 点
交易信用 0 点
原创小红花 0 朵
人气值 0 点
阅读权限 50
注册 2010-11-17
手机型号  5320xm
来自 湖南郴州
状态 离线
 
发表于 2011-6-4 01:29  资料  个人空间  短消息  加为好友  QQ
恩,不错,支持





--->>【神马---浮云】<<---
顶部
行迹天下
旅长
Rank: 7Rank: 7Rank: 7


UID 22917917
精华 0
积分 1537
帖子 1537
威望 1 点
财富值 428 塞班币
贡献值 0 点
好评度 1 点
交易信用 0 点
原创小红花 0 朵
人气值 136 点
阅读权限 35
注册 2010-9-22
手机型号  C5-00
状态 在线
 
发表于 2012-1-26 19:49  资料  个人空间  短消息  加为好友 
支持了





顶部
冷色的咖啡
旅长
Rank: 7Rank: 7Rank: 7


UID 28556484
精华 0
积分 1554
帖子 1554
威望 1 点
财富值 1283 塞班币
贡献值 0 点
好评度 1 点
交易信用 0 点
原创小红花 0 朵
人气值 27 点
阅读权限 35
注册 2011-3-26
手机型号  诺基亚N72
状态 离线
 
发表于 2012-1-27 05:44  资料  个人空间  短消息  加为好友  QQ
类方面的知识还不懂,先提前学习了





每个人都是独一无二的,我这一生只能做我自己,成为不了别人。

顶部
 





当前时区 GMT+8, 现在时间是 2012-5-27 16:22
京ICP备12006419号

百度精准投放VIP客户    基于Discuz!  dospy自优化版本1.0 © 2005-2011
Processed in 0.023979 second(s), 11 queries , Gzip enabled

清除 Cookies - 联系我们 - 工作机会 - dospy智能手机网 - 电信与信息服务业务经营许可证京ICP证090114号 - Archiver - WAP