python在linux制作圖形界面(snack)
snack是一個用于在linux制作圖形界面(GUI)的模塊,該模塊由c編寫,而且redhat的系統都自帶這個模塊。
1.獲取模塊
雖然redhat系統會自帶這個模塊,但是直接去import snack會提示找不到模塊,一個原因是我們重裝了系統的python,所以如果直接import不能找到模塊,可以通過find命令查找
find / -namesnack.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 snackimport *
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”
定義回調的方法
defprint_hello():
print 'hello'
在展示界面的語句即 screen.popWindow()后面加入回調方法的設置
btn1.setCallback(print_hello())
4.有了回調方法,我們就可以實現多頁面的跳轉了
在上面的demo的基礎上,新增加一個window2的頁面,有一個label,entry(文本輸入框)和按鈕,點擊按鈕后,屏幕輸出文本框輸入的內容。
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
importtraceback
fromsnackimport *
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
輸入文字,點擊按鈕,顯示信息
參考:
http://www.wanware.com/tsgdocs/snack.html
http://pydoc.org/1.5.2/snack.html
來自:http://python.jobbole.com/87119/