[Python] dialog를 활용한 Text UI 간단 만들기 Develop Tip

아주 예전에 Gentoo 리눅스에서 perl 과 dialog 라는 명령어를 이용하여
터미널에서의 텍스트 기반 간단 UI를 만든 적이 있습니다.

IP 등의 간단한 설정과 기타 정보를 넣고,
쉘로 실행시켜 보는 것이지요.

그런데 그것을 하드코딩 하려니 비슷한 일이 계속 생길 수 있어,
얼마 전에 파이썬을 이용하여 좀더 Generic 하게 만들어 보았습니다.

작업은 우분투 12.04에서 했지만,
CentOS 에서도 테스트는 해 보았습니다.

특별히 많은 dependency는 존재하지 않습니다.

build.sh (해당 링크) 처럼 설치하면 됩니다.

우선은 간단하게 돌아가는 방법을 알아봅니다.

간단한 diagpy.dic 파일 (해당 링크) 안에
파이썬으로 간단한 방법으로 UI를 기술하고
같은 폴더에 있는 diagpy.py (해당 링크) 를 실행하면 됩니다.

우선 위의 링크에 있는 build.sh, diagpy.dic, diagpy.py 를 한 디렉터리에 넣고,

$ bash build.sh
를 수행한 다음
$ python diagpy.py
를 돌리면,

위와 같이 welcome 화면이 나타납니다.

이 화면 문구는 diagpy.dic 에서 

'intro':{
'title':u'diagpy demo',
'text':u'diagpy text',
'sleep':1.0,
},

부분을 수정하면 됩니다. (한글을 넣어 보았는데 깨지는 현상은 아직 못 잡았습니다)

소개 화면이 약간 있은 후 (위의 sleep인 1.0초) 에 위와 같은 창이 나타납니다.
앞의 A, B, ... F 는 핫키라 생각하시면 됩니다.

우선 첫번째는 yes/no 를 선택하는 다이얼로그가 나타납니다.
위의 A 상태에서 엔터 (OK)를 누르면,

위와 같이 Yes/No 를 선택하는 창이 나타납니다.

diagpy.dic 에서 menu [ ... 하단에 있는

   {
'title':u'Top title 1: yes/no?',
       'dialog':'yesno',
       'key': '1',
   },

이렇게 기술하면 됩니다.
'dialog' 형태는 'yesno' 입니다.
이곳에서 'key' 항목은 문자열로 (위에서는 '1') 해당 결과를 사용할 수 있게 됩니다.
맨 나중에 '1' 키의 값은 True 또는 False 를 저장하게 됩니다.

마찬가지로 B 항목은 텍스트 입력 부분입니다.

위와 같이 한글 포함 텍스트를 입력할 수 있습니다.

diagpy.dic 에서는

   {
'title':u'Top title 2: text',
       'dialog':'inputbox',
       'key': '2',
   },

와 같이 표현됩니다.
'dialog' 형식은 'inputbox' 입니다.

다음은 C의 체크리스트 입니다.

위와 같이 선택할 수 있도록 되어 있습니다.

diagpy.dic 에는

   {
'title':u'Top title 3: checklist',
       'dialog':'checklist',
       'choices':[
           ["1", "Item 1", False],
           ["2", "Item 2", True],
           ["3", "Item 3", True]
       ],
       'key': '3',
   },

와 같이 설정하면 됩니다.
'dialog'는 'checklist' 를 설정하면 되고,
'choices' 에는 리스트 안에 리스트로 [핫키,표시명,디폴트선택여부] 를 나타냅니다.

이제는 radio 선택을 해 봅니다.

디폴트 선택된 것에 [selected] 가 표시되고 이것을 수정해서 OK를 누르면,
다른 것이 선택되었음을 나타냅니다.

diagpy.dic 에는

   {
'title':u'Top title 5: radio',
       'dialog':'menu',
       'choices':[
           ["1", "Item 1"],
           ["2", "Item 2"],
           ["3", "Item 3"]
       ],
       'key': '5',
   },

와 같이 표시 합니다.

'dialog'는 'menu' 입니다. 최상위 메뉴의 D에서의 menu와 헷갈리지 않도록 합니다.

최상위의 F는 암호를 넣는 창입니다.
text 입력창과 동일하지만 입력된 문자열이 나타나지 않고,
또 두번을 확인하여 맞는지를 확인할 수 있습니다.
(TODO : 그 결과는 diagpy.pkl 에 가지고 피클링 되어 가지고 있는데, 암호화 되어 있지는 않습니다)

diagpy.dic 에서는

   {
'title':u'Top title 6: password',
       'dialog':'passwordbox',
       'key': '6',
   },

와 같이 기술됩니다.

이제 최상위 메뉴의 하위 메뉴를 기술해 보는데, D의 메뉴 항목을 누르면

위와 같은 네 가지의 하위 메뉴가 나타나는데, 이것은
diagpy.dic 에서 

   {
'title':u'Top title 4: menu',
       'menu':[
   {
'title':u'4 title 1: yes/no?',
       'dialog':'yesno',
       'key': '4-1',
   },
   {
'title':u'4 title 2: text',
       'dialog':'inputbox',
       'key': '4-2',
   },
   {
'title':u'4 title 3: checklist',
       'dialog':'checklist',
       'choices':[
           ["1", "Item 1", False],
           ["2", "Item 2", True],
           ["3", "Item 3", True]
       ],
       'key': '4-3',
   },
   {
'title':u'4 title 4: menu',
       'menu':[
   {
'title':u'4-4 title 1: yes/no?',
       'dialog':'yesno',
       'key': '4-4-1',
   },
   {
'title':u'4-4 title 2: text',
       'dialog':'inputbox',
       'key': '4-4-2',
   },
   {
'title':u'4-4 title 3: checklist',
       'dialog':'checklist',
       'choices':[
           ["1", "Item 1", False],
           ["2", "Item 2", True],
           ["3", "Item 3", True]
       ],
       'key': '4-4-3',
   },
   ],
   },
   ],
   },

와 같이 'menu' 항목에 리스트 값으로 재귀적으로 기술됩니다.

하위 항목으로 한번 더 들어간 것이고, 하위항목에서는 'Parent' 하단의 선택단추를 통해 이전으로 돌아갑니다.

이제 마무리된 상태에서 최상의 메뉴의 하단 "Save&Execute" 를 선택하면,

Ooooops... 만약

위와 같은 메시지가 나타나면 이것은 diaglog 결과 창에 한글 표시에 실패 했다는 것인데,

한번만 위와 같이 
$ sudo vi /usr/local/lib/python2.7/dist-packages/dialog.py
를 열어
위의 3449 대신 3450 처럼 False  를 빼줍니다.
(한번만 해 주시면 됩니다)

그리고 다시 실행한 다음 "Save&Execute" 를 다시하면

위와 같이 나타납니다.

이것은

diagpy.dic 에서 

'postjob':[
...
]

라는 후처리 부분에

   {
'name':'Do first job',
       'cmd':'echo',
       'key-parameters':[
       '1',
       '2',
       '3',
       '5',
       '6',
],
        'after-stop':True,
   },

부분입니다.

'cmd' 에 해당되는 echo 명령을 수행하고,
그 패러미터로 '1','2',...'6' 이 수행되는데
이것은 각각 위의 다이얼로그에서 지정한 'key'의 지정한 값을 의미합니다.

'after-stop':을 True 라고 하면,
위의 실행한 결과를 대화창으로 표시하고 
그 실행한 stdout과 stderr을 표시합니다.

이런 식으로 여러 개의 배치 후처리 작업을 진행합니다.

이 결과를 diagpy.pkl 에 저장되고
이 다음 diagpy.py 를 실행했을 때에는 마지막에 저장된 값을 가지고 다시 실행하게 됩니다.


이렇게 좀 일반화시킨 Text UI 를 만들어 보았습니다.


어느분께는 도움이 되셨기를...

핑백

  • 지훈현서 : [LXDE] LXDM 로그인 화면설정 및 LXDE 자동 실행 (zenity dialog) 2015-07-22 17:27:54 #

    ... ty --warning --text "해당 사용자의 LXDE가 뜨면서 나타나는 창"Terminal=false 와 같이 지정하면 됩니다. 지난번 터미널에서 텍스트 기반 다이얼로그로 간단 설정 관련 UI를 만들어 본 적이 있는데,이와 유사한 작업을 X윈도우의 gtk 라이브러리를 사용해서 명령행으로 나타나게 할 수 있는 것이바로 ... more

덧글

댓글 입력 영역

구글애드텍스트