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'
import traceback from snack import * screen = SnackScreen() #實例化一個snack界面 def window(): 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() def main(): try: window() except: print traceback.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"
定義回調的方法
def print_hello(): print 'hello'
在展示界面的語句即 screen.popWindow()后面加入回調方法的設置
btn1.setCallback(print_hello())
4.有了回調方法,我們就可以實現多頁面的跳轉了
在上面的demo的基礎上,新增加一個window2的頁面,有一個label,entry(文本輸入框)和按鈕,點擊按鈕后,屏幕輸出文本框輸入的內容。
#encoding=utf-8 __author__ = 'kevinlu1010@qq.com' import traceback from snack import * screen = SnackScreen() def window1(): 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 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 main(): try: window1() except: print traceback.format_exc() finally: screen.finish() #關閉snack界面 return '' main()
界面展示:
第一個界面:
點擊按鈕1后出現界面2
輸入文字,點擊按鈕,顯示信息