免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2289 | 回复: 0

我想問如何撰寫curses多用途dialog?? [复制链接]

论坛徽章:
0
发表于 2013-01-18 23:35 |显示全部楼层
本帖最后由 dreamlearn 于 2013-01-19 00:06 编辑

是這樣的:在寫一個郵件程序用curses做介面,大家都知道一個程序中或多或少都有詢問框架

我覺得如果每個詢問都做一個dialog比較麻煩

我需要的大約是這樣子(你是否確認剷除.) (你是否要儲存)(你是否確認要轉寄)

注意不是所有 dialog 也是 YES / NO,因此需要

根據不同的需求改變其標題字串,還有要改變其選項,改變選項行為

增加或減少選項,我剛剛做了一個版本不過不好

你們會怎麼做呢,我的方案不太好所以想參考一下大家的做法,

如果有代碼就更昜理解。

這是一個測試
  1. import curses
  2. scr = curses.initscr( )
  3. curses.cbreak( )
  4. curses.noecho( )
  5. y, x = scr.getmaxyx( )

  6. data = {'desination': 'Jack'}

  7. def infoinput( ):
  8.     global win
  9.     scr.box( )
  10.     win.addstr(4, 4, '_' * 30, curses.A_BOLD)
  11.     curses.echo( )
  12.     data['destination'] = win.getstr(4, 4)
  13.     curses.noecho( )

  14. def dialog(self=None, Y_X_optionList=None, Y_X_messageList=None, execute=None):
  15.     global position, win
  16.     pos_y, pos_x = int(y/2)-6, int(x/2)-22
  17.     box_h, box_w = 8, 44
  18.     win = curses.newwin(box_h, box_w, pos_y, pos_x)
  19.     win.keypad(True)  
  20.     if Y_X_optionList != None and execute != None:
  21.         exec_func = execute
  22.     elif Y_X_optionList == None and execute != None:
  23.         pass
  24.     else:                       
  25.         Y_X_optionList = [[6,10,'<CANCEL>'], [6,30,'<YES>']]
  26.         exec_func = {0: '0', 1: '1'}
  27.     def __displayMessage( ):
  28.         for msg_y, msg_x, message in Y_X_messageList:
  29.             win.addstr(msg_y, msg_x, message)
  30.     def __displayOption( ):
  31.         index = 0
  32.         for opt_y, opt_x, option in Y_X_optionList:
  33.             win.addstr(opt_y, opt_x, option)
  34.             if index == position:
  35.                 win.addstr(6, opt_x, option, curses.A_BOLD | curses.A_STANDOUT)
  36.             index += 1
  37.     def __displayFull( ):
  38.         win.clear( )
  39.         win.box  ( )  
  40.         __displayMessage( )
  41.         __displayOption ( )
  42.         win.refresh( )
  43.         
  44.     position = 0
  45.     optnum   = len(Y_X_optionList) - 1
  46.     def Getkeybord( ):
  47.         global position
  48.         __displayFull( )
  49.         key = win.getch( )
  50.         if key == curses.KEY_LEFT and position > 0 :
  51.             position -= 1
  52.         elif key == curses.KEY_RIGHT and position < optnum:
  53.             position += 1
  54.         elif key == ord('\n'):
  55.             return eval(exec_func[position])
  56.         return 1  
  57.     while Getkeybord( ):
  58.         continue
  59.     win.addstr(4, 4, str(data['destination']))
  60.     win.refresh( )
  61.     win.getch( )   

  62. dialog(execute={0: 0, 1: 1, 2: 'infoinput( )'},Y_X_optionList = [[6,10,'<CANCEL>'], [6,20,'<YES>'], [6, 30, '<Save as>']],  Y_X_messageList=[[2, 4, 'Hello this is a test'], [3, 4, 'python curses dialog']])

  63. curses.endwin( )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP