python在linux(anaconda)的图形界面(snack)

一、简介

       snack是一个用于在linux制作图形界面(GUI)的模块,该模块由c编写,而且redhat的系统都自带这个模块。Snack是python对newt的接口,Newt是一个为RedHat-linux安装程序而设计的基于文本的窗口开发工具, 并不依赖X包,所以Snack可以为安装程序设计简单的窗口界面。
       借助snack可开发Linux安装程序字符界面。在Linux系统安装过程中选择文本模式安装,安装过程中出现的snack的界面。
python在linux(anaconda)的图形界面(snack)_第1张图片

二、详解

1、获取模块

       若在Python中from snack import *,找不到模块,可以使用find命令查找:find /usr/lib64/python2.6/ -name snack.py。显示结果:/usr/lib64/python2.6/site-packages/snack.py,则只需要在目录/usr/lib64/python2.6/site-packages/下复制snack.py和_snackmodule.so这两个文件复制到当前项目中,就能通过from snack import * 来导入snack模块。

2、demo程序

(1)代码:
#encoding=utf-8
import traceback
from snack import *

screen = SnackScreen()  

def window1():
    btn2 = Button('按钮1')  
    btn3 = Button('按钮2')
    g = Grid(2, 1)   
    g.setField(btn2, 0, 0)  
    g.setField(btn3, 1, 0)
    screen.gridWrappedWindow(g, "我的界面1")
    f = Form() 
    f.add(g)  
    result = f.run()
    screen.popWindow()
    #btn2.setCallback(window2())  #设置回调方法为界面2
    #btn3.setCallback(leave())  #设置回调方法为离开  
    if result == btn2:
        btn2.setCallback(window2())  #设置回调方法为界面2
    else:
        btn3.setCallback(leave())  #设置回调方法为离开
    
def window2():
    def print_name(name):
        print '你的名称是:%s' % name

    label = Label('请输入名称:')  
    entry = Entry(10, '')  
    btn1 = Button('确定') 
    g = Grid(2, 2)   
    g.setField(label, 0, 0)  
    g.setField(entry, 1, 0)
    g.setField(btn1, 1, 1)
    screen.gridWrappedWindow(g, "我的界面2")
    f = Form()  #实例化一个form
    f.add(g)    #把网格填充到form
    result = f.run()
    screen.popWindow()
    btn1.setCallback(print_name(entry.value()))

def leave():
    print 'leave'
    return ''

def main():
    try:
        window1()
    except:
        print traceback.format_exc()
    finally:
        screen.finish()  #关闭snack界面
        return ''

main()
(2)运行(有些问题存在)
   
  (3)解释:首先调用screen = SnackScreen() 将终端的背景刷成蓝色,直到调用screen.finish()蓝色的屏幕才能消失;使用gird设置组件的布局,g = Grid(2, 2),g为2个Widget宽,2个Widget的网格;screen.gridWrappedWindow(g, "Title Text")必须调用,用来将g绑定到一个window;screen.finish()退出snack,否则终端一直呈现蓝色,无论按crtrl+c或者ctrl+z都不能退出。

3、snack相关组件

组件类

参数

方法

Buttontext)

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

 

heightListbox里显示的行数;

scroll:是否显示滚动条;

returnExit: 如果在box内按下ENTER时,窗口将退出;

width:设置Listbox的宽度;

showCursor:值为1Listbox内的当前条目会有光标闪动。

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是一个0total之间的数,

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被选时的返回对象,第三个是011代表默认选中。

add(title, value, default = None):添加一个新的SingleRadioButtonRadio 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):添加一个Checkboxtree的末尾,其中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)

4、部分组件代码

(1)ButtonChoiceWindow:
#encoding=utf-8
from snack import SnackScreen, ButtonChoiceWindow
screen = SnackScreen()
ButtonChoiceWindow(screen, 'Fatal Error',
                   'You do not have enough RAM to install on this machine.\n'
                   '\n'
                   'Press <return> to reboot your system.\n', )
                   #buttons = ("OK",))
screen.finish()
python在linux(anaconda)的图形界面(snack)_第2张图片
或:
#encoding=utf-8
from snack import *
screen = SnackScreen()
ButtonChoiceWindow(screen, title="ButtonChoiceWindowDemo",  text= "text:choice", buttons = ['Ok','Cancel'], 
                   width = 40, x = None, y = None, help = None)
screen.finish()
python在linux(anaconda)的图形界面(snack)_第3张图片
(2) ListboxChoiceWindow:
#encoding=utf-8
from snack import *
screen = SnackScreen()
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)
screen.finish()
python在linux(anaconda)的图形界面(snack)_第4张图片
(3)EntryWindow:
#encoding=utf-8
from snack import *
screen = SnackScreen()
EntryWindow(screen, title="EntryWindowDemo", text="text:", prompts=["entry1", "entry2", "entry3"], allowCancel = 1, 
            width = 40, entryWidth = 20, buttons = [ 'Ok','Cancel' ], help = None)
screen.finish()
python在linux(anaconda)的图形界面(snack)_第5张图片

三、总结

(1)参考:http://www.wanware.com/tsgdocs/snack.html、http://pydoc.org/1.5.2/snack.htmlhttp://www.ibm.com/developerworks/cn/linux/guitoolkit/newt/index.html
(2)若有建议,请留言,在此先感谢!

你可能感兴趣的:(python,snack)