snack是一个用于在linux制作图形界面(GUI)的模块,该模块由c编写,而且redhat的系统都自带这个模块。
1.获取模块
虽然redhat系统会自带这个模块,但是直接去import snack会提示找不到模块,一个原因是我们重装了系统的python,所以如果直接import不能找到模块,可以通过find命令查找
find / -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.一个snack的demo
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
importtracebackfrom snack import *screen= SnackScreen() #实例化一个snack界面
defwindow():
btn1= Button('按钮1') #实例化一个按钮组件
btn2 = Button('按钮2') #实例化一个按钮组件
g = Grid(2, 1) #实例化一个两列,一行的网格
g.setField(btn1, 0, 0) #把组件填充到网格中
g.setField(btn2, 1, 0)
screen.gridWrappedWindow(g,"我的界面")
f= Form() #实例化一个form
f.add(g) #把网格填充到form
result =f.run()
screen.popWindow()defmain():try:
window()except:printtraceback.format_exc()finally:
screen.finish()#关闭snack界面
return ''main()
实例化一个SnackScreen后,程序结束时,一定要调用finish,不然终端就会一直显示蓝色的页面,而且该终端已经不可以用了。所以在调试的时候,最好用try,finally的形式,确保程序出错也会执行finish方法。
一个snack页面主要有三种对象组成,一种是组件,例如这里的Button,可以查看snack.py查看到所以可用的组件和方法,可用的组件有Button,Label,Text,Textbox,Checkbox等,第二种是网格,网格主要用于布局,网格里面可以嵌套网格,实现复杂的界面布局。第三种就是form,所有要展示的东西都要放在form里面。
这个demo的界面:
3.回调方法
每一个组件都有一个回调方法的接口,我们可以设置组件的回调方法,来相应用户的操作。
例如上面的demo,我们希望在用户按下按钮1时打印一个"hello"
定义回调的方法
defprint_hello():print 'hello'
在展示界面的语句即 screen.popWindow()后面加入回调方法的设置
btn1.setCallback(print_hello())
4.有了回调方法,我们就可以实现多页面的跳转了
在上面的demo的基础上,新增加一个window2的页面,有一个label,entry(文本输入框)和按钮,点击按钮后,屏幕输出文本框输入的内容。
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
importtracebackfrom snack import *screen=SnackScreen()defwindow1():
btn1= Button('按钮1')
btn2= Button('按钮2') # g = Grid(2, 1)
g.setField(btn1, 0, 0)
g.setField(btn2,1, 0)
screen.gridWrappedWindow(g,"我的界面1")
f=Form()
f.add(g)
result=f.run()
screen.popWindow()
btn1.setCallback(window2())#设置回调方法为界面2
defwindow2():defprint_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()))defmain():try:
window1()except:printtraceback.format_exc()finally:
screen.finish()#关闭snack界面
return ''main()
界面展示:
第一个界面:
点击按钮1后出现界面2
输入文字,点击按钮,显示信息