简介
Snack是python对newt的接口,Newt是一个为Red Hat linux安装程序而设计的基于文本的窗口开发工具,并不依赖X包, 所以Snack'可以为安装程序设计简单的窗口界面。下面分别介绍使用snack的一般步骤和各组件的使用。
创建snack的一般步骤,示例代码如清单1。
清单1.创建snack一般步骤示例代码
from snack import *
screen = SnackScreen()
upperleft = Widget()
upperrrght = Widget()
lowerleft = Widget()
lowerright = Widget()
g = Grid(2, 2)
g.setField(upperleft, 0, 0, (0,,0, 1, 1))
g.setField(upperright, 1, 0)
g.setField(lowerleft, 0, 1)
g.setField(lowerright, 1, 1, growx = 1, growy =
1)
f = Form()
f.add(g)
result = f.run()
screen.popWindow()
screen.finish()
代码解释如下。
-
首先调用screen = SnackScreen()将终端的背景刷成蓝色,直到调用screen.finish()蓝色的屏幕才能消失。
-
定制要使用的snack组件
upperleft = Widget()
upperrrght = Widget()
lowerleft = Widget()
lowerright = Widget()
-
使用gird设置组件的布局,
g = Grid(2, 2),g为2个Widget宽,2个Widget的网格。
g.setField(upperleft, 0, 0, (0, 0, 1, 1)):其中(0,0,1,1)表示(left, top, right, bottom),用来确定组件周围的空间,
g.setField(upperright, 1, 0)
g.setField(lowerleft, 0, 1)
g.setField(lowerright, 1, 1, growx = 1, growy = 1):其中growx = 1, growy = 1指当组件大小和周围的不一致时,用来调整大小。
-
screen.gridWrappedWindow(g, "Title Text")
这句必须调用,用来将g绑定到一个window
-
f = Form() f.add(g) result = f.run() screen.popWindow()
f将g加入到消息循环机制中
-
screen.finish()
退出snack,否则终端一直呈现蓝色,无论按crtrl+c或者ctrl+z都不能退出
相关组件(Widget)介绍
组件详细介绍如表1所示。
表1.组件介绍
组件类 | 参数 | 方法 |
Button(text) | text: 显示的名称 (下同) | |
CompactButton(text) 同Button类,但显示的按钮更简洁 | | |
Checkbox (text, isOn = 0) | isOn=0:未选中 isOn=1:选中 | value(): 返回box是否被选中 Selected(): 返回box当前是否被选中 setFlags(flag,senese) Flag: FLAG_DISABLED Sense: FLAGS_SET:true FLAGS_RESET:false FLAGS_TOGGLE:flag的相反值 |
SingleRadioButton (text,group,isOn = 0) | group:如果当前的SingleRadioButton对象与上一个为一组,则group值为上一个SingleRadioButton对象 | selected() :返回此SingRadioButton是否被选中 |
Listbox(height, scroll = 0, returnExit = 0, width = 0, showCursor = 0): 列出可选项,但每次只能选择一项,如果想选择多项,可使用CheckBoxList | height:Listbox里显示的行数; scroll:是否显示滚动条; returnExit: 如果在box内按下ENTER时,窗口将退出; width:设置Listbox的宽度; showCursor:值为1则Listbox内的当前条目会有光标闪动。 | append(text, item): 增加一个选项在Listbox末尾,其中item为选项ID; Insert(text, item, before): 在before选项前添加,如果before设为None,则添加到开头; delete(item) : 删除选项item; replace(text, item): 将item当前的名称替换为text; current(): 返回用户当前的选项的item; setCurrent(item): 设置item为当前选项; clear(): 清空Listbox内的所有选项。 |
Textbox(width, height, text, scroll = 0, wrap = 0) 显示文本 | scroll:设置有无滚动条; wrap:设置是否确保所有文本在box内。 | setText(text): 设置在Textbox上显示的文本 |
Scale(width, total) 进度条组件 | total: 进度条显示的最大值 | set(amount): 用来设置当前进度,其中amount是一个0到total之间的数, |
Entry(width, text = "", hidden = 0, password = 0, scroll = 1, returnExit = 0) 输入框 | width:输入文本的大小; text:输入框的初始文本; hidden:是否隐藏text; password:输入的text是否未密码,如果是密码,将显示为*; scroll:若scroll=1,则当文本太长不足以显示的时候,用户可以水平滚动。 | value():返回在Entry里当前的文本 set(text): 设置当前要显示的文本为text setFlags(flag, sense): 同Checkbox的成员函数setFlag |
RadioBar(screen, buttonlist) 用来创建一组SingleRadioButton | buttonlist是由tuple组成的list,每个tuple有三个元素,第一个是SingleRadioButton显示的名称,第二个是当SingleRadioButton被选时的返回对象,第三个是0或1,1代表默认选中。 | add(title, value, default = None):添加一个新的SingleRadioButton到Radio Button组里,其中value参数为getSeletion函数的返回对象; getSelection():返回当前选中的Radio Button的相关的返回对象。 |
ButtonBar(screen, buttonlist): 提供一组buttons | Buttonlist是由描述button的三个不同类型组成,分别是(text, return value, hotkey),两个元素代表没有hotkey, 一个string类型代表返回对象同string。 | |
CheckboxtTree(height, scroll = 0) 由多个Checkbox对象组成。 | | append(text, item = None, selected = 0):添加一个Checkbox到tree的末尾,其中selected=0,则初始化未选中, 等于1为选中; getCurrent(): 返回光标高亮的元素; getSelection(): 返回所有选中元素的list; setEntry(item, text): 改变与item相关的text; setEntryValue(item, selected = 1): 设置item是否选中; getEntryValue(item):返回item是否被选中; addItem(text, path, item = None, selected = 0) |
addIterm详解
addIterm方法与append方法类似,但是path比较特殊,决定添加的Checkbox的位置它的类型是tuple,snackArgs['append']在tuple的最后代表tuple的结束。
清单2. addItem示例代码片段
tree = CheckboxTree(height = 5, scroll = 1)
tree.addItem("First",
(snackArgs['append'], ))
tree.addItem("Second",
(snackArgs['append'], ))
tree.addItem("A", (0,
snackArgs['append']))
tree.addItem("B", (0,
snackArgs['append']))
tree.addItem("X", (0, 1,
snackArgs['append']))
开始tree只显示First和Second,First为可扩展,Second为一个Checkbox,扩展First后A是一个Checkbox,B又是一个可扩展的,扩展为X的Checkbox。运行结果如图1和图2所示。
图1.开始显示的界面
![image](https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/resource/BLOGS_UPLOADED_IMAGES/checkwindow2.png)
图2.点击<+>后显示的界面
![image](https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/resource/BLOGS_UPLOADED_IMAGES/checkwindow3.png)
常用对话框示例
生成一个具有Listbox的窗口
清单3.生成Listbox窗口示例代码
ListboxChoiceWindow(screen,
title="ListboxChoiceWindow Demo", text="List:",
items=[("list1",1),("list2",2)],
buttons = ('Ok', 'Cancel'), width = 40, scroll =
0,
height = -1, default = None, help = None)
运行显示的界面如图3所示。
图3. ListboxChoiceWidnow示例界面
![image](https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/resource/BLOGS_UPLOADED_IMAGES/Listwindow.png)
按钮窗口
清单4.按钮窗口示例代码
ButtonChoiceWindow(screen,
title="ButtonChoiceWindowDemo",
text= "text:", buttons = ['Ok',
'Cancel'],
width = 40, x = None, y = None, help = None)
运行结果如图4所示。
图4. ButtonChoiceWindow示例界面
![image](https://i-blog.csdnimg.cn/blog_migrate/b292b9a115162e5fd596e722f42df0c6.png)
输入框窗口
清单5.输入框窗口示例代码
EntryWindow(screen, title="EntryWindowDemo",
text="text:", prompts=["entry1", "entry2",
"entry3"], allowCancel = 1,
width = 40, entryWidth = 20, buttons = [ 'Ok',
'Cancel' ],
help = None)
运行结果如图5所示。
图5. EntryWindow示例界面
![image](https://i-blog.csdnimg.cn/blog_migrate/fb99ee81d452a714b5cfc095edae5478.png)
小结
snack提供了python对newt的接口,借助snack可开发OS安装程序字符界面。本文主要介绍了snack的功能,使用步骤和snack组件的使用方法,为今后的开发工作提供帮助。
参考资源