1. 概述

本文档主要介绍XSConsole的界面显示所使用的主要几个类,以及它们相互之间的关系。

2 XSConsole主界面介绍

Xsconsole主界面元素介绍,如下图所示。主界面可分为两部分,TopWindow(顶部)和MainWindow,这两个都是属于CursesWindow类。(后面介绍各个类以及之间的关系)MainWindow所占据的区域是整个下半部分,包含左侧的MenuPane和右侧的StatusPane,但实际上这一部分界面是有RootDialogue负责的。MenuPane是一个DialoguePane的对象,界面上主要包含有TitleField(显示Customize System),MenuField(菜单列表)和KeyHelpField(按键帮助信息)。StatusPane也是一个DialoguePane的对象,界面上包含TitleField(显示Network Configuration),WrappedTextField(显示描述信息,可自动换行)和StatusField(显示属性名,属性值的关系列表)。

3 XSConsole界面的主要类介绍

如下图所示,主画面所使用的类主要包括:Layout, Dialogue,CursesWindow,DialoguePane,Fields。

3.1 CursesWindow类(XSConsoleCurses.py)

CursesWindow类实际上继承于CursesPane类,用于创建子窗口,可以指定窗口的大小和坐标,以及Title和边框等。实际上,XSConsole是使用curses模块提供的功能来实现字符显示,颜色控制,按键捕获等。首先,调用curses.initscr()创建整个屏幕。然后,调用subwin()创建CursesWindow的子窗口。

AddWrappedText()用于显示字符,可以指定起始坐标,字符串及字符颜色等。

GetKey()用于捕获按键信息。

3.2 Layout类(XSConsoleLayout.py)

Layout,负责控制整个显示画面。

首先,由主程序XSConsoleTerm的Enter()创建一个Layout对象。

self.layout = Layout.NewInst()

然后,调用self.layout.Create()创建TopWindow及MainWindow这两个CursesWindow对象,将主画面分成上下两个子窗口。

最后,self.layout.CreateRootDialogue(…))创建RootDialogue,由RootDialogue(继承于Dialogue类)负责生成MenuPane和StatusPane,并完成其他界面显示的任务。

Layout类可以包含多个CursesWindow和多个Dialogue对象。当界面需要刷新的时候,主程序会调用Layout的Refresh(),如下所示。Layout会依次调用其所包含的CursesWindow和Dialogues的刷新方法。

def Refresh(self):

for window in self.windows:

window.Refresh()

for dialogue in self.dialogues:

dialogue.Render()

Layout管理Dialogue对象的方法是使用堆栈的方式,可以使用PushDialogue(),PopDialogue()和TopDialogue()进行操作。最先创建的Dialogue,即RootDialogue,处于堆栈的底部,在刷新画面时会最先被绘制。而堆栈顶部的Dialogue在最后被绘制,所以总显示在最上面。

3.3 Dialogue类(XSConsoleDialogueBases.py)

Dialogue类是XSConsole最主要的界面管理单元。可以说,XSConsole就是基于Dialogue来管理界面显示,按键捕获处理等。

每个Dialogue可以包含多个DialoguePane,每个DialoguePane其实就是一个子窗口,将整个Dialogue分成几个部分,每个部分的界面显示由各个DialoguePane控制。UpdateFields()用于刷新Dialogue的画面。而HandleKey()用于处理主程序传递过来的按键信息。

Dialogue类还包含了几个辅助子类,如FieldArranger,FieldGroup和InputTracker。FieldArranger类用于排列计算Dialogue包含的所有Fields对象的坐标值。FieldGroup类负责将Fields分为BodyFields,StaticFields和InputFields,以区分显示和处理。InputTracker类用于控制光标在不同Field之间的切换。

3.4 DialoguePane类(XSConsoleDialoguePane.py)

每个DialoguePane类都包含一个子窗口,以及多个Fields。当需要在DialoguePane上显示一串字符信息时,可以调用DialoguePane的AddWrappedTextField()方法。如下所示。

def AddWrappedTextField(self, inText, inFlow = None):

self.AddBodyFieldObj(WrappedTextField(inText, self.selectedColour, FirstValue(inFlow, Field.FLOW_RETURN)))

AddWrappedTextField方法增加一个WrappedTextField对象。当DialoguePane调用Render()进行刷新界面时,会调用每个Field对象的Render方法,例如field.Render(win, xpos, ypos),其中win为DialoguePane所指向的子窗口对象。Field的Render方法会在win子窗口的(xpos,ypos)显示其内容。

3.5 Fields类(XSConsoleFields.py)

Fields类算得上是界面显示的最小控制单元。每种不同的Field实现不同的显示效果。

TitleField类,实现标题栏显示。

MenuField类,实现菜单列表的显示。

KeyHelpField类,在窗口底部实现按键信息显示。

WrappedTextField类,可以显示一段字符串信息,根据窗口大小自动换行。

3. LoginDialogue类分析

以LoginDialogue类说明如何创建一个新的Dialogue类,Layout如何管理Dialogue,以及Dialogue是如何工作的。

在未登陆的情况下,执行某些操作时XSConsole会要求用户做帐户验证。这时会弹出LoginDialogue对话框。如下图所示:

启动LoginDialogue的代码如下所示,调用Layout的PushDialogue将新建的LoginDialogue放进Dialogue堆栈。

Layout.Inst().PushDialogue(LoginDialogue(Lang(‘Please log in to perform this function’), inFunc))

再看LoginDialogue的实现代码,主要也就是需要UpdateFields()和HandleKey(),分别负责界面显示和按键处理。__init__()初始化,获得输入参数信息,新建DialoguePane,然后调用UpdateFields()。UpdateFields()分别增加TitleField,用户名输入Field,密码输入Field和按键信息Field,完成整个画面的显示。

当用户触发按键输入时,HandleKey()被调用,并根据不同按键执行相应的操作。当收到‘Escape’按键时,将调用Layout.Inst().PopDialogue()退出该对话框。PopDialogue()将该LoginDialogue从Layout的Dialogue堆栈中弹出。

class LoginDialogue(Dialogue):

def __init__(self, inText = None,  inSuccessFunc = None):

Dialogue.__init__(self)

self.text = inText

self.successFunc = inSuccessFunc

pane = self.NewPane(DialoguePane(self.parent))

pane.TitleSet(“Login”)

pane.AddBox()

self.UpdateFields()

pane.InputIndexSet(0)

def UpdateFields(self):

pane = self.Pane()

pane.ResetFields()

if self.text is not None:

pane.AddTitleField(self.text)

pane.AddInputField(Lang(“Username”, 14), “root”, ‘username’)

pane.AddPasswordField(Lang(“Password”, 14), Auth.Inst().DefaultPassword(), ‘password’)

pane.AddKeyHelpField( {

Lang(“[Esc]“) : Lang(“Cancel”),

Lang(“[Enter]“) : Lang(“Next/OK”),

Lang(“[Tab]“) : Lang(“Next”)

})

def HandleKey(self, inKey):

handled = True

pane = self.Pane()

if inKey == ‘KEY_ESCAPE’:

Layout.Inst().PopDialogue()

linux curse库函数,curse相关推荐

  1. linux动态库注册函数,Linux动态库函数的详解

    linux动态库函数的详解 加载动态库 void *dlopen(const char *filename, int flag); flag的可能值: rtld_lazy rtld_now rtld_ ...

  2. linux 动态库构造函数,Linux动态库函数的详解

    Linux动态库函数的详解 加载动态库 void *dlopen(const char *filename, int flag); flag的可能值: RTLD_LAZY RTLD_NOW RTLD_ ...

  3. Unix/Linux下的Curse库开发指南——第六章 菜单开发及应用

    6.1菜单简介 6.1.1菜单概念     在第三章中我们曾经使用curses窗口创建了一个简单的菜单程序,从程序中可以看到菜单实际上是一系列选项的组合,我们一次可以选中一项或者多项,也可以使用方向键 ...

  4. linux动态库函数dlopen与dlsym使用

    为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件. linux提供了加载和处理动态链接库的系统调用,主 ...

  5. linux ping库函数,Linux 常用基本命令 ping ifconfig

    今天這篇博客小編給你講解網絡上常用的命令:ping , ifconfig. 一.ping 命令通過發送Internet控制報文協議(ICMP)回響請求消息來驗證與另一台TCP/IP計算機連接情況. p ...

  6. 【Linux】——库函数

    文章目录 1.库函数的基础概念 2.基础文件操作函数 2.1fopen 2.2fread 2.2fwrite 2.4fseek 2.5fclose 1.库函数的基础概念 1.库函数 库函数(Libra ...

  7. linux ping库函数,在Linux上用C++实现Ping

    首先我们在terminal上使用ping命令并用wireshark软件抓包,看看实现ping命令需要那些协议,以及ping的数据包由那些内容构成. ping.png catch_ping.png 用w ...

  8. Linux:库函数:libc: glibc

    文章目录 Note 手册的使用 源代码阅读问题 概述 glibc 编译配置 glibc 编译参数调整 版本信息 名词解释 csu nptl sysdeps 组织架构 每个函数都是一个单独的文件 一般结 ...

  9. Linux系统库函数之strsep

    /* lib/string.c */ strsep函数用于分割字符串,函数原型如下: char *strsep(char **s, const char *ct); s为指向欲分割的字符串,ct为分隔 ...

最新文章

  1. maven初学者(一)
  2. gui linux 桌面应用,吃掉Linux开发者,WSL支持GUI应用
  3. C语言do...while语句的妙用(包裹宏替换多句代码)(代替go to语法)(隔绝外部变量)
  4. pytorch学习知识点总结
  5. 初中知识会不会影响计算机,初中计算机论文
  6. N Problems During K Days
  7. 如果Java快死了,那么它肯定看起来非常健康
  8. c语言字符为0和1,//C语言:将一个由字符0和1组成的表示二进制数的字符串,转换成相应的十进制数返回。...
  9. mysql整段注释_MySQL 添加注释(comment)
  10. Python股票基金数据分析 爬虫 基金对比 Django框架 数据可视化
  11. 多路视频直播播放器系统框架
  12. 清华计算机录取通知书,清华送出第一批录取通知书,这些被刷屏的学霸,有怎样的成长密码...
  13. 祝大家新年快乐,前兔似锦!
  14. 如何把很多照片拼成一张照片_如何能把多张照片拼凑在一张上图片上
  15. midaspay能删除吗_midaspay 什么意思
  16. 【FTP】FTP常用命令,持续更新中……
  17. 《黄聪:手机移动站SEO优化教程》2、PC端和手机移动端SEO优化区别
  18. HTML移动端开发常见的兼容性总结
  19. 揭发一名以淘宝订单异常退款的骗子
  20. JAVA_HOME环境配置

热门文章

  1. 程序员常用的工具网站
  2. 人教版三年级计算机教学计划,2017人教版三年级信息技术教学计划范文
  3. 微型计算机基础理论——计算机中的数制及其应用
  4. .ps格式的文件怎么打开?
  5. 文件指纹修改工具 Hash Modifier
  6. js判断IE浏览器(包括IE11)
  7. 全程软件测试:非功能性需求
  8. 微信公众号数据2019_数据丨2019年微信公众号文章数据报告!
  9. 10周拿下腾讯数据分析师认证
  10. android 微信好友,朋友圈分享