python在linux制作图形界面(snack)

jvkefxingbt 8年前
   <p>snack是一个用于在linux制作图形界面(GUI)的模块,该模块由c编写,而且redhat的系统都自带这个模块。</p>    <p><strong>1.获取模块</strong></p>    <p>虽然redhat系统会自带这个模块,但是直接去import snack会提示找不到模块,一个原因是我们重装了系统的python,所以如果直接import不能找到模块,可以通过find命令查找</p>    <pre>  <code class="language-python">find / -namesnack.py  </code></pre>    <p>找到的结果:/usr/lib64/python2.6/site-packages/snack.py</p>    <p>只需要在目录/usr/lib64/python2.6/site-packages/下复制snack.py和_snackmodule.so这两个文件复制出来拉到项目中,就能通过from snack import * 来导入snack模块</p>    <p><strong>2.一个snack的demo</strong></p>    <pre>  <code class="language-python">#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()  </code></pre>    <p>实例化一个SnackScreen后,程序结束时,一定要调用finish,不然终端就会一直显示蓝色的页面,而且该终端已经不可以用了。所以在调试的时候,最好用try,finally的形式,确保程序出错也会执行finish方法。</p>    <p>一个snack页面主要有三种对象组成,一种是组件,例如这里的Button,可以查看snack.py查看到所以可用的组件和方法,可用的组件有Button,Label,Text,Textbox,Checkbox等,第二种是网格,网格主要用于布局,网格里面可以嵌套网格,实现复杂的界面布局。第三种就是form,所有要展示的东西都要放在form里面。</p>    <p>这个demo的界面:</p>    <p style="text-align:center"><img src="http://static.open-open.com/lib/uploadImg/20161227/20161227153536_897.bmp"></p>    <p><strong>3.回调方法</strong></p>    <p>每一个组件都有一个回调方法的接口,我们可以设置组件的回调方法,来相应用户的操作。</p>    <p>例如上面的demo,我们希望在用户按下按钮1时打印一个”hello”</p>    <p>定义回调的方法</p>    <pre>  <code class="language-python">defprint_hello():      print 'hello'  </code></pre>    <p>在展示界面的语句即 screen.popWindow()后面加入回调方法的设置</p>    <pre>  <code class="language-python">btn1.setCallback(print_hello())  </code></pre>    <p><strong>4.有了回调方法,我们就可以实现多页面的跳转了</strong></p>    <p>在上面的demo的基础上,新增加一个window2的页面,有一个label,entry(文本输入框)和按钮,点击按钮后,屏幕输出文本框输入的内容。</p>    <pre>  <code class="language-python">#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()  </code></pre>    <p>界面展示:</p>    <p>第一个界面:</p>    <p style="text-align:center"><img src="http://static.open-open.com/lib/uploadImg/20161227/20161227153537_49.bmp"></p>    <p>点击按钮1后出现界面2</p>    <p style="text-align:center"><img src="http://static.open-open.com/lib/uploadImg/20161227/20161227153537_496.bmp"></p>    <p>输入文字,点击按钮,显示信息</p>    <p style="text-align:center"><img src="http://static.open-open.com/lib/uploadImg/20161227/20161227153537_805.bmp"></p>    <p><strong>参考: </strong></p>    <p><a href="/misc/goto?guid=4959731678384410931" rel="nofollow,noindex">http://www.wanware.com/tsgdocs/snack.html</a></p>    <p><a href="/misc/goto?guid=4959731678473302887" rel="nofollow,noindex">http://pydoc.org/1.5.2/snack.html</a></p>    <p> </p>    <p>来自:http://python.jobbole.com/87119/</p>    <p> </p>