wxpython ÇÁ·Î±×·¡¹Ö
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
Docbook ¿ø¹®

WxPython À» ÀÌ¿ëÇÑ GUI ÀÀ¿ë Á¦ÀÛ

1절. GUI ÇÁ·Î±×·¡¹ÖÀÇ Çʿ並 ´À³¢°Ô µÇ´Ù.

ÇÊÀÚ´Â ÁÖ·Î Linux/Unix ȯ°æ¿¡¼­ ½Ã½ºÅÛ/³×Æ®¿÷ ÇÁ·Î±×·¡¹Ö ÀÛ¾÷À» ÇØ¿ÔÀ¸¸ç, Windows °è¿­·Î´Â Çлý½ÃÀý¿¡ ¾ÆÁÖ Àá±ñ º¼·£µå C++ À» ÀÌ¿ëÇØ¼­ ³ëÆ®ÆÐµå(¾ó¸¶³ª ¸¸µé±â ½¬¿îÁö ¾Æ½Ã´ÂºÐÀº ´Ù ¾Æ½ÃÁÒ --;) Çѹø¸¸µé¾î º»°Ô À©µµ¿ìÁî(GUI) ÇÁ·Î±×·¡¹ÖÀÇ Ã³À½ÀÌÀÚ ¸¶Áö¸·ÀÌ¿´´Ù.(Linux ÂÊ¿¡¼­´Â Qt ÂÊÀ» Á» º¸±ä Çß¾úÁö¸¸)

±×·¯´Ù°¡ ÃÖ±Ùµé¾î ¾÷¹«»óÀÇ ÀÌÀ¯·Î GUI ÇùÖÀ» ÇØ¾ßµÉ óÁö¿¡ ³õÀÌ°Ô µÇ¾ú´Ù. ²À ¾÷¹«»óÀÇ ÀÌÀ¯°¡ ¾Æ´Ï´õ¶óµµ, GUI ÇùÖÀÇ ±âº»°³³äÀº ÀÍÇô ³õ¾Æ¾ß °Ú´Ù°í ±×µ¿¾È »ý°¢Çϰí ÀÖ¾ú´Âµ¥, ¸¶Ä§ ÀߵǾú´Ù ½Í¾î ¾î¶² µµ±¸¸¦ »ç¿ëÇÏ´Â°Ô ÁÁÀ»Áö ¼±ÅÃÇϱâ À§ÇØ ¿©±â Àú±â µÚÀûÀ̱⠽ÃÀÛÇß´Ù.


1.1절. ¼±ÅñâÁØ

¾î¶² µµ±¸¸¦ ¼±ÅÃÇϱâ À§Çؼ­´Â ¼±ÅÃÀ» À§ÇÑ ¸íÈ®ÇÑ ±âÁØÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. ÇÊÀÚ´Â ´ÙÀ½°ú °°Àº ¿ä°ÇµéÀ» ¸¸Á·½ÃŰ´Â µµ±¸¸¦ ¿øÇß´Ù.

¹è¿ì±â ½¬¿ö¾ß ÇÑ´Ù.

GUI´Â °³ÀÎÀûÀ¸·Î Àü·«Àû °ø·«(°øºÎ) ´ë»óÀÌ ¾Æ´Ï¿´´Ù. ÇÊÀÚÀÇ Àü·«Àû °ø·« ´ë»óÀº ½Ã½ºÅÛ/³×Æ®¿÷ °ü·Ã ºÎºÐÀÌ¿´°í, GUI´Â ¾î´ÀÁ¤µµ ÀÌÇØÇÏ°í ±¸¼ºÇÒ¼ö ÀÖÀ»Á¤µµ ±îÁö¸¸ ÇÒ»ý°¢ÀÌ¿´À½À¸·Î, °­·ÂÇÏÁö¸¸ ÀÌÇØ°¡ ¾î·Æ°í, º¹ÀâÇÑ ±×·± µµ±¸¸¦ ¼±ÅÃÇÏ°í ½ÍÁö´Â ¾Ê¾Ò´Ù. ºñ·Ï °­·ÂÇÔÀÌ Á¶±Ý ´úÇÏ´õ¶óµµ, ÀÌÇØÇÏ°í ¹è¿ì±â ½¬¿î µµ±¸¸¦ ¼±ÅÃÇÏ±æ ¿øÇß´Ù. °Å±â¿¡ µ¡ºÙ¿© ºÎÁ·ÇÑ °­·ÂÇÔÀ» ¸Þ¿ï¼ö ÀÖµµ·Ï c/c++ °ú Àß ¿¬°áµÇ´Â µµ±¸¶ó¸é ±Ý»ó÷ȭÀÏ °ÍÀÌ´Ù.

±â¾÷ȯ°æ¿¡ Àû¿ë½Ãų¼ö ÀÖ¾î¾ß ÇÑ´Ù.

»ç¿ëµÉ µµ±¸´Â Ãë¹Ì»ýȰ·Î Áñ±æ¼öµµ ÀÖÁö¸¸, ÇÊ¿äÇÒ°æ¿ì ¾÷¹«¿¡ Àû¿ëµÉÁöµµ ¸ð¸¥´Ù. ±×·¯¹Ç·Î ±â¾÷(enterprise)ȯ°æ¿¡¼­ÀÇ Àû¿ë°¡´É¼ºµµ ¿°µÎ¿¡ µÎ¾î¾ß Çß´Ù.

Å©·Î½º Ç÷§Æû ȯ°æ ÁöÇâ

¿ª½Ã GUI Çϸé Windows ȯ°æÀ» µû·Î ¶¼¾î ³õ°í »ý°¢ÇÒ¼ö ¾ø´Ù. ±×·¯¸é¼­ µ¿½Ã¿¡ Linuxȯ°æµµ Áö¿øÇÏ°í ½Í¾ú´Ù. "Å©·Î½º Ç÷§ÆûÀº ȯ»óÀÌ´Ù" ¶ó°í ÁÖÀåÇÏ´Â ºÐµéµµ ¸¹±â´Â ÇÏÁö¸¸ ÃÖ´ëÇÑ Å©·Î½º Ç÷§Æû¿¡ °¡±õ¿î µµ±¸¸¦ ÇÊ¿ä·Î Çß´Ù.

¶óÀ̼¾½º ¹®Á¦

ÀÌ¿ÕÀÌ¸é °ø°³µÈ µµ±¸¸¦ »ç¿ëÇÏ´Â°Ô ÁÁ´Ù. °ø°³µÇÁö ¾Ê¾Ò´Ù ÇÏ´õ¶óµµ Àú·ÅÇÑ °¡°Ý¿¡ ¶óÀ̼¾½º ȹµæÀÌ °¡´ÉÇØ¾ß ÇÑ´Ù.

Àç¹ÌÀÖ¾î¾ß ÇÑ´Ù

¼±ÅÃÇÑ µµ±¸°¡ ³Ê¹« ±¸ÅÂÀÇ¿¬Çϰųª ±¸½À¿¡ ¾ô¸Å¿© ÀÖÀ»°æ¿ì °øºÎÇÏ´Ù ÁöÃĹö¸±¼öµµ ÀÖÀ¸¹Ç·Î, Àû´çÈ÷ Àç¹ÌÀÖ¾î¾ß Çß´Ù.

Â÷¼¼´ë ÀüÅõ±â ¼±Á¤ ¹æ½ÄÀ¸·Î °¢°¢ÀÇ ¿ä°Ç¿¡ ´ëÇÑ °¡ÁßÄ¡¸¦ ¸Å°Üº»´Ù¸é, °¡ÁßÄ¡ÀÇ ¼ø¼­´Â (½±°í > Å©·Î½º Ç÷§ÆûÁöÇâÀûÀ̸ç > Àç¹ÌÀÖ°í > ±â¾÷ȯ°æÀû¿ë°¡´É¼º > ±î´Ù·ÓÁö ¾ÊÀº ¶óÀ̼¾½º) ¼øÀÌ¿´´Ù.


1.2절. wxPython À» ¼±Åà ÇÏ´Ù

À§ÀÇ Á¶°ÇÀ» ¸¸Á·½ÃŰ´Â µµ±¸¸¦ ã±âÀ§ÇØ Á¶»ç¸¦ ÇØº»°á°ú ÃÖÁ¾ÀûÀ¸·Î Qt¿Í wxPython, Gtk ·Î ¼±ÅÃÀÇ ÆøÀ» Á¼Èú ¼ö ÀÖ°Ô µÇ¾ú´Ù. Qt¿Í Gtk ´Â °¢°¢ C++, C·Î ÀÌ·ç¾îÁ³À½À¸·Î ±×µ¿¾È ÀÍÇô¿Ô´ø ÇÁ·Î±×·¡¹Ö ±â¼úÀ» »ç¿ëÇÒ¼ö ÀÖ´Ù´Â Á¡°ú ÀÌ µÎ ¾ð¾î°¡(C/C++)ÀÌ °ÅÀÇ »ê¾÷Ç¥ÁØÀ̶ó´Â Á¡, ²Ï Àç¹ÌÀÖÀ»°Å¶ó´Â Á¡ÀÌ ¸¾¿¡ µé¾ú´Ù. °Ô´Ù°¡ QtÀÇ °æ¿ì´Â Å©·Î½º Ç÷§Æû ȯ°æÀ» Áö¿øÇϰí ÀÖÀ¸¸ç, °³ÀÎÀûÀ¸·Î ÁÁ¾ÆÇÏ°í ¸î¹ø ´Ù·ç¾îº» °æÇèÀÌ Àִٴ°͵µ ÀåÁ¡À¸·Î ÀÛ¿ëÇß´Ù.

Gtk ¿ª½Ã ¸Å¿ì ÈǸ¢Çϱä ÇÏÁö¸¸, Qt¿¡ ºñÇØ ±×¸® ÁÁ¾ÆÇÏÁö ¾Ê°í, ´Ù·ç¾îº»Àûµµ ¾ø¾úÀ¸¸ç, Å©·Î½º Ç÷¡½º Ç÷§Æû ȯ°æÀÇ Áö¿øÀÌ 3°³ÀÇ µµ±¸Áß °¡Àå Ãë¾àÇß´Ù. ±â¹Ý¾ð¾î°¡ C¶ó´Â °Íµµ Á» ¸¾¿¡ µéÁö ¾Ê¾Ò´Ù.

°á±¹ wxPython À» ¼±ÅÃÇß´Ù. ÀÌÀ¯´Â °¡Àå ¹è¿ì±â ½±°í, °¡Àå Àç¹ÌÀÖÀ» °Í °°¾Ò±â ¶§¹®ÀÌ¿´´Ù. Python ÀÌ ½ºÅ©¸³Æ® ¾ð¾îÀÎ °ü°è·Î ½î¾²Äڵ尡 º¸ÀÌ´Â Á¡ ¶§¹®¿¡ ±â¾÷ȯ°æ¿¡ Àû¿ëÇϱⰡ Á¶±Ý ¾Ö¸ÅÇÒ°Í °°±âµµ ÇßÀ¸³ª, C³ª C++·Î Áß¿äÄڵ带 °¨Ãß´Â °ÍÀ¸·Î ¾î´ÀÁ¤µµ ÇØ°áÀÌ °¡´ÉÇÒ°ÍÀ̶ó°í »ý°¢Çß´Ù. ´ÙÇàÈ÷ pythonÀº ´Ù¸¥ ¾ð¾îµé°ú ½±°Ô °áÇÕÇÒ¼ö Àִ Ư¡À» Áö´Ï°í ÀÖ´Ù. ±×¸®°í ¾îÂ÷ÇÇ Àü¹®ÀûÀÎ GUI ÇùÖÀ» ¸ñÀûÀ¸·Î Çϴ°ÍÀÌ ¾Æ´Ï¿´À½À¸·Î ½î¾²Äڵ尡 º¸ÀÌ´Â Á¡ÀÌ Å©°Ô ¹®Á¦ÀϰŶó°í´Â »ý°¢Áö ¾Ê¾Ò´Ù. °Ô´Ù°¡ ±â¹Ý¾ð¾îÀÎ Python Àº ²Ï ¿À·¡ ´Ù·ç¾î ¿Ô¾ú°í, ²Ï Àç¹ÌÀÖ°í ÈǸ¢ÇÑ ¾ð¾î¶ó°í »ý°¢ÇØ¿À°í ÀÖ¾ú´Ù. ±×¸®°í 3°³ÀÇ µµ±¸Áß °¡Àå Å©·Î½º Ç÷§Æû ȯ°æÀ» ¿Ïº®ÇÏ°Ô Áö¿øÇϰí ÀÖ¾ú´Ù.

wxPython ÀÌ ºñ·Ï "±â¾÷ȯ°æÀû¿ë" Ãø¸é¿¡¼­ °¡Àå ³·Àº Á¡¼ö¸¦ ¹Þ±â´Â ÇßÁö¸¸, ³ª¸ÓÁö ºÐ¾ß¿¡¼­ ÃÖ°íÀÇ Á¡¼ö¸¦ ¹ÞÀ½À¸·Î "GUI ÀÀ¿ë" Á¦ÀÛÀ» À§ÇÑ µµ±¸·Î ³«Á¡µÇ°Ô µÇ¾ú´Ù.


2절. wxPython ÇÁ·Î±×·¡¹Ö

À̹øÀå¿¡¼­´Â wxPython¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸í°ú ÇÔ²², tutorial ¹æ½ÄÀ¸·Î wxPthon ÇÁ·Î±×·¡¹ÖÀÌ ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇÒ°ÍÀÌ´Ù. ¿©±â¿¡ ÀÖ´Â ¹®¼­ÀÇ ¸¹Àº ³»¿ëÀº wxpython.org¿Í wiki.wxpython.orgÀÇ ³»¿ëÀ» Âü°íÇϰí ÀÖ´Ù.

ÀÌ ±ÛÀº Python ¿¡ ´ëÇÑ ±âº»ÀûÀÎ ÀÌÇØ¸¦ Çϰí ÀÖ´Ù´Â °¡Á¤ÇÏ¿¡ ¸¸µé¾îÁ³´Ù. PythonÀ» Á¢Çغ¸Áö ¾Ê¾Ò´Ù¸é, ¿ì¼± ÆÄÀÌ½ã Æ©Å丮¾ó¸¦ Àо°í ¹Ù¶õ´Ù. C¿Í C++ ȤÀº ´Ù¸¥¾ð¾î¿¡ ¾î´ÀÁ¤µµ Àͼ÷ÇÏ´Ù¸é, 2-3 ÀÏÁ¤µµ¿¡ ÆÄÀ̾´ Äڵ带 ÃæºÐÈ÷ ÀÌÇØÇÒ¼ö ÀÖ°Ô µÉ°ÍÀÌ´Ù.

¾ÕÀ¸·Î ´Ù·ç°Ô µÉ ³»¿ëÀº Linux os ÀÇ Red Hat °è¿­À» ±âÁØÀ¸·Î ¼³¸íµÇ¾î Áø´Ù. ÄÚµåµé ¿ª½Ã À§ ȯ°æ¿¡¼­ Å×½ºÆ®µÇ¾ú´Ù. Windows ȯ°æ¿¡¼­ÀÇ ¼³¸íÀº ½Ã°£ÀÌ µÇ´Â´ë·Î Å×½ºÆ®¸¦ ÇØº»´ÙÀ½¿¡ º¸°­ ¼³¸íÇϵµ·Ï ÇϰڴÙ.


2.1절. wxPython ¿¡ ´ëÇÏ¿©

wxPython Àº Python ÇÁ·Î±×·¡¹Ö¾ð¾î¿¡ ±â¹ÝÇÑ GUI toolkit(ÀúÀÛµµ±¸)·Î, ±¸Á¶ÀûÀÌ°í ¹è¿ì±â ½¬¿î Python ¾ð¾î¸¦ ÀÌ¿ëÇØ¼­ graphical user interface ¸¦ °£´ÜÇÏ°í ºü¸¥½Ã°£¿¡ Á¦ÀÛ°¡´ÉÇϵµ·Ï µµ¿ÍÁØ´Ù. wxPython Àº Å©·Î½º Ç÷§Æû GUI ¶óÀ̺귯¸®ÀÎ wxWindows ¸¦ Python ¿¡¼­ Áö¿ø°¡´ÉÇϵµ·Ï c++ À» ÀÌ¿ëÇØ¼­ Á¦ÀÛÇѰÍÀÌ´Ù.

wxPython ´Â Å©·Î½º Ç÷§Æû ŸŶÀÌ´Ù. Áï ÇϳªÀÇ Ç÷§Æû¿¡¼­ ÀÛµ¿°¡´ÉÇϵµ·Ï ¸¸µç ½î¾²´Â (´ëºÎºÐÀǰæ¿ì) ¼öÁ¤¾øÀÌ ´Ù¸¥ Ç÷§Æû¿¡ À̽ÄÀÌ °¡´ÉÇÏ´Ù. ÇöÀç wxPythonÀº À©µµ¿ì¿Í ´ëºÎºÐÀÇ Unix¹× Unix ȣȯ ½Ã½ºÅÛ¿¡¼­ ÀÛµ¿ÇÑ´Ù. ¸ÅŲÅä½Ã ¹öÁ¯Àº ÇöÀç pre-alpha ·Î, Á¶¸¸°£ Áö¿ø°¡´ÉÇÒ°ÍÀ¸·Î »ý°¢µÈ´Ù.

Python °ú ¸¶Âù°¡Áö·Î wxWindows¿ª½Ã Open Source ¸ðµ¨ÀÌ´Ù. ±×·¯¹Ç·Î ½î¾²¸¦ ÀÌ¿ëÇØ¼­ ¹«¾ùÀ» ¸¸µéµçÁö ¾Æ¹«·± Á¦ÇÑÀÌ ¾øÀ¸¸ç, wxWindows ½î¾² ÀÚü¸¦ ¼öÁ¤ ÇÏ´õ¶óµµ ÀüÇô ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. ¶ÇÇÑ À̵éÀ» ±â¹ÝÀ¸·Î ¸¸µé¾îÁø wxPython ¿ª½Ã °ø°³ÀÌ´Ù. wxWindows ´Â ÇöÀç 2.0 ¾ÈÁ¤¹öÁ¯ÀÌ °ø°³µÇ¾î ÀÖÀ¸¸ç Windows 3.1/95/98/NT¿Í Unix GTK/Motif/Lesstif, ¸ÅŲÅä½Ã ¹öÁ¯À» Áö¿øÇÑ´Ù.

python °ú wxWindows, wxPython ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ÀÇ »çÀÌÆ®µéÀ» Âü°íÇϱ⠹ٶõ´Ù.


2.2절. wxPython À» À§ÇØ ÇÊ¿äÇѰ͵é

¿äÁòÀÇ ¹èÆ÷º»Àº ±âº»ÀûÀ¸·Î wxPython ÇÁ·Î±×·¡¹Ö °¡´ÉÇÑ È¯°æÀ¸·Î Á¦°øµÇ¹Ç·Î Linux ¼³Ä¡¿Í µ¿½Ã¿¡ ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÒ°ÍÀÌ´Ù. ±×·¸Áö¸¸ ¸¸¾àÀÇ °æ¿ì¶õ°ÍÀÌ ÀÖÀ¸¹Ç·Î °£´ÜÇÏ°Ô ¾î¶°ÇÑ ÆÐŰÁöµéÀÌ ÇÊ¿äÇÑÁö Á¤µµ´Â ¾ð±ÞÇÏ°í ³Ñ¾î°¡µµ·Ï ÇϰٴÙ.

  • python

  • wxPython

  • wxGTK


2.3절. Hello World

¿ª½Ã ¹¹µçÁö óÀ½½ÃÀÛÇÒ¶§, "Hello World" ¸¸Å­ ÁÁÀº°Ô ¾ø´Â°Í °°´Ù. ¿ì¼± wxPythonÀÌ Á¦´ë·Î ÀÛµ¿ÇÏ´ÂÁö ¾Ë¾Æº¸±â À§Çؼ­, °¡Àå °£´ÜÇÑ ¾îÇø®ÄÉÀ̼ÇÀ» Çϳª ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.

#!/usr/bin/python

from wxPython.wx import * 

class MyFrame(wxApp):
    def OnInit(self):
        frame = wxFrame(NULL, -1, "Hello World")
        frame.Show(true)
        self.SetTopWindow(frame)
        return true

app = MyFrame(0)
app.MainLoop()
			
ÀÌ°É ½ÇÇà½ÃŰ¸é ´ÙÀ½°ú °°Àº ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÈ´Ù.

그림 1. Hello World

°¡Àå¸ÕÀú wxPython À» import ½ÃÄѼ­ wxPython ¿¡¼­ Á¦°øÇÏ´Â °¢Á¾ Ŭ·¡½º¿Í ÇÔ¼öµéÀ» »ç¿ë°¡´ÉÇϵµ·Ï ¸¸µç´Ù.

¸ðµç wxPython ¾îÇø®ÄÉÀ̼ÇÀº wxApp Ŭ·¡½º¿¡¼­ Á¦°øÇÏ´Â OnInit ¸Þ¼­µå¸¦ ÅëÇØ¼­ ¸¸µé¾îÁø´Ù. OnInit Àº Windows ¸¦ ¸¸µé°í, ÇÁ·Î±×·¥ÀÌ Ã³À½¿¡ ½ÃÀÛÇϸ鼭 ÇÊ¿ä·ÎÇÏ´Â °¢Á¾ ÃʱâÈ­ ÀÛ¾÷À» ½ÇÇàÇÏ°Ô µÈ´Ù. ±×¸®°í wxFrame ¸¦ ÀÌ¿ëÇÏ¿© window (parent window ȤÀº main frame)¸¦ ¸¸µé¸éµÈ´Ù. óÀ½¿¡ À©µµ¸¦ ¸¸µé¶§ º¸ÅëÀº »ý¼ºÀÚ(constructor)¸¦ ÀÌ¿ëÇÏ¿© À©µµÀÇ À§Ä¡¿Í Å©±â¸¦ ÁöÁ¤ÇØÁÖÁö¸¸, ¿©±â¿¡¼­´Â ÇÁ·Î±×·¥À» ÃÖ¼ÒÇÑ °£¼ÒÈ­ ½Ã۱â À§Çؼ­, À̸¦ »ý·«Çß´Ù. »ý·«ÇÒ°æ¿ì¿¡´Â ±âº»°ªÀ¸·Î ¸¸µé¾îÁö°Ô µÈ´Ù.

¸¶Áö¸· 2°³ÀÇ ¶óÀÎÀº ¾Æ¸¶µµ ¸ðµç wxPython ÇÁ·Î±×·¥¿¡ °øÅëÀûÀ¸·Î Æ÷Ç﵃ °ÍÀÌ´Ù. ¸¶Áö¸· 2°³ÀÇ ¶óÀο¡¼­ ¿ì¸®°¡ ¸¸µç ¾îÇø®ÄÉÀÌ¼Ç Å¬·¡½ºÀÇ instance ¸¦ »ý¼ºÇϰí MainLoop()¸Þ¼­µå¸¦ ÅëÇØ¼­ ¸¸µç Ŭ·¡½º¸¦ È£ÃâÇÏ°Ô µÈ´Ù. MainLoop ´Â wxPython ¾îÇø®ÄÉÀ̼ÇÀÇ ÇÙ½É ¿ä¼Ò·Î, À̺¥Æ®¸¦ ÇÁ·Î¼¼½ÌÇÏ°í ¾îÇø®ÄÉÀ̼ǿ¡ Æ÷ÇԵǾî ÀÖ´Â ¿©·¯°¡Áö À©µµ¿ì¿¡ À̺¥Æ®¸¦ Àü´ÞÇÏ´Â µîÀÇ ÀÏÀ» ¼öÇàÇÑ´Ù. ´ÙÇàÀ̵µ ¿ì¸®´Â ÀÌ·¯ÇÑ °úÁ¤ÀÌ ÀϾ´Â ¼¼ºÎÀûÀÎ ³»¿ëÀ» ¸ô¶óµµ µÈ´Ù. wxPython ÀÌ ¾Ë¾Æ¼­ ó¸®ÇØ Áֱ⠶§¹®ÀÌ´Ù. ¿ì¸®´Â ´ÜÁö »ç¿ëÇϱ⸸ ÇÏ¸é µÈ´Ù.


2.4절. ½ÇÀü GUI ¾îÇø®ÄÉÀÌ¼Ç Á¦ÀÛ

±×·³ ÀÌÁ¦ ½ÇÁ¦ÀûÀÎ GUI ÀÀ¿ë ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ. º¸Åë GUI ÇÁ·Î±×·¥Àº ¸î°¡Áö °øÅëÀûÀÎ À¯Àú ÀÎÅÍÆäÀ̽º¸¦ °¡Áö´Âµ¥, ŸÀÌÆ²¹Ù, ¸Þ´º¹Ù, ¸ÞÀÎÀÛ¾÷â, »óŹÙ, ½ºÅ©·Ñ¹ÙµîÀÌ´Ù. ÀÌ·¯ÇÑ °ÍµéÀº ´ëºÎºÐÀÇ GUI ÀÀ¿ëÇÁ·Î±×·¥¿¡ À־ °ÅÀÇ ÇʼöÀûÀ¸·Î »ç¿ëµÇ´Â °ÍµéÀÌ´Ù. ¾Æ·¡´Â ÀÌ·¯ÇÑ ¿ä¼ÒµéÀ» °¡Áö´Â Ç¥ÁØÀûÀÎ GUI ÇÁ·Î±×·¥ÀÇ ´ÜÀûÀÎ ¸ð½ÀÀ» º¸¿©ÁØ´Ù.

그림 2. GUI ÀÀ¿ë ÇÁ·Î±×·¥

¿©·¯°¡Áö GUI ÀÀ¿ëÇÁ·Î±×·¥Áß¿¡¼­ editor °¡ Ç¥ÁØÀûÀÎ GUI¿¡ °¡Àå Ãæ½ÇÇÑ È­¸éÀ» º¸¿©ÁÖ¸ç ¶ÇÇÑ ±¸ÇöÇϱⰡ ´ëü·Î ¼ö¿ùÇϱ⠶§¹®¿¡, À̹ø Àå¿¡¼­´Â wxPython À» ÀÌ¿ëÇØ¼­ editor ¸¦ ±¸ÇöÀ» ÇØº¸µµ·Ï ÇϰڴÙ.


2.4.1절. edit component ¸¦ Ãß°¡½ÃŰÀÚ

ÀÀ¿ëÇÁ·Î±×·¥À» ¸¸µå´Â ´ëºÎºÐÀÇ °æ¿ì¿¡ À־, ¾Æ¸¶µµ ´ç½ÅÀº main frame(parent window) ¸¦ ¿ëµµ¿¡ ¸Â°Ô ÃÖÀûÈ­ ½ÃÄѼ­ »ç¿ëÇÏ±æ ¿øÇÒ°ÍÀÌ´Ù. ±×·¡¼­ wxFrame À» ÁÖ·Î »ç¿ëÇÏ°Ô µÈ´Ù. wxFrame ´Â °¡Àå ±âº»ÀûÀÎ main frame ¸¸À» Á¦°øÇØÁÖ´Â ´ë½Å, »ç¿ëÀÚ°¡ ÇÊ¿ä·Î ÇÏ´Â ¸¹Àº »çÇ×µéÀ» Á÷Á¢ Ãß°¡ ½ÃÄÑ ÃÖÀûÈ­ ½ÃŰ±â ½±µµ·Ï ¸¸µé¾îÁØ´Ù.

#!/usr/bin/python

from wxPython.wx import *

class MainWindow(wxFrame):
    def __init__(self, parent, id, title):
        wxFrame.__init__(self, parent, -4, title, size = (200, 100),
                style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
        self.control = wxTextCtrl(self, 1, style=wxTE_MULTILINE)
        self.Show(true)

app = wxPySimpleApp()
frame = MainWindow(None, -1, "small editor")
frame.Show(1)
app.MainLoop()

À§ÀÇ ÄÚµå´Â ¸Å¿ì °£´ÜÇÏ´Ù. °¡Àå¸ÕÀú wxFrame À¸·ÎºÎÅÍ »ó¼ÓÀ» ¹ÞÀº MainWindow ¶ó´Â Ŭ·¡½º¸¦ Á¤ÀÇ Çϰí __init__ ¸Þ¼­µå¸¦ ¿À¹ö·ÎµùÇÑ´Ù. ÀÌ ¸Þ¼­µå ¾È¿¡¼­ wxTextCtrl À̶õ °£´ÜÇÑ ÇÔ¼ö¸¦ »ç¿ëÇߴµ¥, ÀÌ ÇÔ¼ö´Â ¹®¼­ÆíÁýÀ» À§ÇÑ text âÀ» ¸¸µé¾îÁØ´Ù. À§ÀÇ Äڵ带 ½ÇÇà½ÃÄѼ­ ¹®¼­ÆíÁý ÀÛ¾÷À» ÇØº¸¸é, ´Ü¼øÈ÷ text ÀԷ¿ܿ¡µµ º¹»ç(Ctrl+c), ºÙÀ̱â(Ctrl+v), »èÁ¦(Ctrl+x) ¿Í °°Àº ±âº»ÀûÀÎ ÆíÁý±â´É±îÁö Á¦°øÇϰí ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù.

그림 3. editor component


2.4.2절. ¸Þ´º¿Í »óŹÙÀÇ Ãß°¡

¸ðµç GUI ¾îÇø®ÄÉÀ̼ÇÀº ¸Þ´º¹Ù¿Í »óŹٸ¦ °¡Áö°í ÀÖ´Ù. À§ÀÇ ÇÁ·Î±×·¥ÀÌ ¸Þ´º¿Í »óŹٸ¦ Áö¿øÇϵµ·Ï ½î¾²Äڵ带 ¼öÁ¤ÇØ º¸ÀÚ.

#!/usr/bin/python

from wxPython.wx import *

ID_ABOUT = 101
ID_EXIT = 110

class MainWindow(wxFrame):
    def __init__(self, parent, id, title):
        wxFrame.__init__(self, parent, -4, title, size = (400, 500),
                style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
        self.control = wxTextCtrl(self, 1, style=wxTE_MULTILINE)
        self.CreateStatusBar()

        filemenu = wxMenu()
        filemenu.Append(ID_ABOUT, "&About", "ÇÁ·Î±×·¥¿¡ ´ëÇÑ Á¤º¸")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT, "E&xit", "ÇÁ·Î±×·¥Á¾·á")

        menuBar = wxMenuBar()
        menuBar.Append(filemenu, "&ÆÄÀÏ")
        self.SetMenuBar(menuBar)

        self.Show(true)

app = wxPySimpleApp()
frame = MainWindow(None, -1, "small editor")
frame.Show(1)
app.MainLoop()
				

그림 4. Simple Editor_1


2.4.3절. À̺¥Æ® ´Ù·ç±â

À§ÀÇ ÇÁ·Î±×·¥À» ¿ÜÇüÀûÀÎ Ãø¸éÀ¸·Î¸¸ º»´Ù¸é, GUI ¾îÇø®ÄÉÀ̼ÇÀÌ °¡Á®¾ßÇÒ ÃÖ¼ÒÇÑÀÇ ¿ä°ÇÀ» ÃæÁ·½Ã۰í ÀÖÀ½À» ¾Ë¼ö ÀÖ´Ù. ±×·¯³ª ³»ºÎÀûÀÎ ±â´É±¸ÇöÀº ÀüÇô ÀÌ·ç¾îÁöÁö ¾Ê°í ÀÖ´Ù.

GUI ÇÁ·Î±×·¥¿¡¼­ ±â´ÉÀÇ ½ÇÇàÀº ¸¶¿ì½º·Î ¹öưÀ» Ŭ¸¯ÇÔÀ¸·Î½á ´ëºÎºÐ ¹ß»ýÇÑ´Ù. ¸Þ´º¿¡¼­ "Quit" ¹öưÀ» Ŭ¸¯Çϸé "ÇÁ·Î±×·¥ Á¾·á" ±â´ÉÀÌ ¼öÇàµÇ¾î¾ß Çϸç, "Help" ¹öưÀ» Ŭ¸¯Çϸé "µµ¿ò¸» â"À» È­¸é¿¡ º¸¿©Áà¾ß ÇÑ´Ù. À§ÀÇ ÇÁ·Î±×·¥¿ª½Ã "About" ¸Þ´º¸¦ ¼±ÅÃÇØ¼­ ¸¶¿ì½º¸¦ Ŭ¸¯Çϸé "ÇÁ·Î±×·¥¿¡ ´ëÇѼ³¸í"À» º¸¿©Áà¾ß Çϰí, "Exit" ¸Þ´º¸¦ Ŭ¸¯Çϸé "ÇÁ·Î±×·¥À» Á¾·á" ½ÃÄÑ¾ß ÇÑ´Ù.

ÀÌ·¯ÇÑ ÇϳªÇϳªÀÇ »ç°Ç(¸¶¿ì½º¸¦ ¿òÁ÷ÀÓ, Ŭ¸¯, ´õºíŬ¸¯, µå·¡±×, µå·Ó ...) À» "À̺¥Æ®"¶ó°í ÇÑ´Ù. GUI ÇÁ·Î±×·¥¿¡¼­´Â ÀÌ·¯ÇÑ À̺¥Æ®¸¦ ¹Þ¾Æ¼­, ¾î¶²Á¾·ùÀÇ À̺¥Æ®ÀÎÁö¸¦ È®ÀÎÇÏ°í °Å±â¿¡ Àû´çÇÑ ÇÔ¼ö¸¦ È£Ãâ½ÃÄѾßÇÑ´Ù. ÀÌ·¯ÇÑ À̺¥Æ® ó¸®ÀÛ¾÷Àº GUI ÇÁ·Î±×·¡¹Ö¿¡ À־ °¡Àå ¾î·Á¿î ºÎºÐÀÌ µÉ°ÍÀÌ´Ù. ¸¶¿ì½º À§Ä¡°¡ ¾îµð¿¡ ÀÖ´ÂÁö È®ÀÎÇØ¾ßÇϰí, Ŭ¸¯À» ÇßÀ»°æ¿ì Ŭ¸¯ À§Ä¡°¡ ¾îµðÀÎÁö, ¼±ÅÃµÈ ¸Þ´º¹üÀ§ ³»¿¡¼­ Ŭ¸¯µÇ¾ú´ÂÁö µîµîÀ» ó¸®ÇÒ¼ö ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ À̺¥Æ® 󸮸¦ À§Çؼ­ Motif³ª GTK °°Àº°æ¿ì´Â callback ÇÔ¼ö(ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅÍ)¸¦ È£ÃâÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇϸç, Qt °°Àº°æ¿ì´Â signal/slot ±â¹ýÀ» »ç¿ëÇÑ´Ù. ¾î¶µç ¿ì¸®´Â wxpython ÀÌ ³»ºÎÀûÀ¸·Î ¾î¶»°Ô ÀÌ·¯ÇÑ À̺¥Æ®¸¦ ó¸®ÇÏ´ÂÁö¿¡ ½Å°æ¾µÇÊ¿ä ¾øÀÌ, wxpython ¿¡¼­ Á¦°øÇÏ´Â °£´ÜÇÑ ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇØ¼­ ¾ÆÁÖ ½±°Ô À̺¥Æ®¸¦ ó¸®ÇÒ¼ö ÀÖ´Ù.

#!/usr/bin/python

from wxPython.wx import *

ID_ABOUT = 101
ID_EXIT = 110

class MainWindow(wxFrame):
    def __init__(self, parent, id, title):
        wxFrame.__init__(self, parent, -4, title, size = (400, 500),
                style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
        self.control = wxTextCtrl(self, 1, style=wxTE_MULTILINE)
        self.CreateStatusBar()

        filemenu = wxMenu()
        filemenu.Append(ID_ABOUT, "&About", "ÇÁ·Î±×·¥¿¡ ´ëÇÑ Á¤º¸")
        filemenu.AppendSeparator()
        filemenu.Append(ID_EXIT, "E&xit", "ÇÁ·Î±×·¥Á¾·á")

        menuBar = wxMenuBar()
        menuBar.Append(filemenu, "&ÆÄÀÏ")
        self.SetMenuBar(menuBar)

        EVT_MENU(self, ID_ABOUT, self.OnAbout)
        EVT_MENU(self, ID_EXIT, self.OnExit)

        self.Show(true)
    def OnAbout(self, e):
        d = wxMessageDialog(self, "»ùÇà ÇÁ·Î±×·¥\n"
                          "Made in wxPython",
                          "ÀÌ ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿©", wxOK|wxICON_INFORMATION)
        d.ShowModal()
        d.Destroy()

    def OnExit(self, e):
        self.Close(true)

app = wxPySimpleApp()
frame = MainWindow(None, -1, "small editor")
frame.Show(1)
app.MainLoop()
				

wxPyton ¿¡¼­ÀÇ À̺¥Æ®¹ß»ýÇßÀ»¶§, ÇÊ¿äÇÑ ¸Þ¼­µå¸¦ ºÎ¸£´Â°Ç EVT_* ¸¦ ÀÌ¿ëÇÑ´Ù.

EVT_MENU(self, ID_ABOUT, self.OnAbout)
				
¸Þ´º¿¡¼­ ID_ABOUT À̺¥Æ®¸¦ ¹ß»ý½Ã۸é, ÀÌ À̺¥Æ®´Â À©µµ¿ì Àڽſ¡°Ô º¸³»Áö°í, self.OnAbout ¸Þ¼­µå¸¦ È£ÃâÇÏ°Ô µÈ´Ù.


2.4.4절. ÆÄÀÏ ºÒ·¯¿À±â ¹× ÀúÀåÇϱâ

ÀÌÁ¦ ÆÄÀϺҷ¯¿À±â¿Í ÀúÀåÇϱ⠱â´É¸¸ ±¸ÇöÇϸé editor ¿Ï¼ºÀÌ´Ù. ±â´ÉÀÇ ±¸ÇöÀº °£´ÜÇÏ´Ù "¸Þ´º¹Ù"¿¡ "Open", "Save" ¸Þ´º¸¦ Ãß°¡ÇÑ´ÙÀ½¿¡ Open, Save ¹öưÀ» ´­·¶À»°æ¿ìÀÇ À̺¥Æ®¿¡ ´ëÇÑ ¸Þ¼­µå¸¸ ¸¸µé¸é µÈ´Ù.

#!/usr/bin/python

from wxPython.wx import * 

ID_ABOUT = 101
ID_EXIT = 110
ID_OPEN = 120
ID_SAVE = 130

class MainWindow(wxFrame):
    def __init__(self, parent, id, title):
        wxFrame.__init__(self, parent, -4, title, size = (400, 500), 
                style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
        self.control = wxTextCtrl(self, 1, style=wxTE_MULTILINE)
        self.dirname = "."
        self.CreateStatusBar()

        filemenu = wxMenu()
        filemenu.Append(ID_ABOUT, "&About", "ÇÁ·Î±×·¥¿¡ ´ëÇÑ Á¤º¸")
        filemenu.AppendSeparator()
        filemenu.Append(ID_OPEN, "O&pen", "ÆÄÀÏ¿­±â")
        filemenu.Append(ID_SAVE, "S&ave", "ÆÄÀÏÀúÀå") 
        filemenu.Append(ID_EXIT, "E&xit", "ÇÁ·Î±×·¥Á¾·á")

        menuBar = wxMenuBar()
        menuBar.Append(filemenu, "&ÆÄÀÏ")
        self.SetMenuBar(menuBar)

        EVT_MENU(self, ID_ABOUT, self.OnAbout)
        EVT_MENU(self, ID_EXIT, self.OnExit)
        EVT_MENU(self, ID_OPEN, self.OnOpen)
        EVT_MENU(self, ID_SAVE, self.OnSave)

        self.Show(true)
    def OnAbout(self, e):
        d = wxMessageDialog(self, "»ùÇà ÇÁ·Î±×·¥\n"
                          "Made in wxPython",     
                          "ÀÌ ÇÁ·Î±×·¥¿¡ ´ëÇÏ¿©", wxOK|wxICON_INFORMATION) 
        d.ShowModal()
        d.Destroy()

    def OnExit(self, e):
        self.Close(true)

    def OnSave(self, e):
        dlg=wxFileDialog(self, "ÆÄÀÏÀúÀå", self.dirname, "", "*.*", wxOPEN)
        if dlg.ShowModal() == wxID_OK:
            self.filename=dlg.GetFilename();
            self.dirname=dlg.GetDirectory();
            f=open(self.dirname+"/"+self.filename, "w")
            f.write(self.control.GetValue())
            f.close()

        dlg.Destroy()

    def OnOpen(self, e):
        dlg=wxFileDialog(self, "Choose a file", self.dirname, "", "*.*", wxOPEN)
        if dlg.ShowModal() == wxID_OK:
            self.filename=dlg.GetFilename()
            self.dirname=dlg.GetDirectory()
            f=open(self.dirname+"/"+self.filename, "r")
            self.control.SetValue(f.read())
            f.close()
        dlg.Destroy()

app = wxPySimpleApp()
frame = MainWindow(None, -1, "small editor")
frame.Show(1)
app.MainLoop()

				

´ÙÀ½Àº "Save" ¹öưÀ» Ŭ¸¯ÇßÀ»¶§ÀÇ "ÆÄÀÏ ¼±Åà ´ëÈ­»óÀÚ" ÀÌ´Ù.

그림 5. my_editor ½ÇÇàÈ­¸é

그림 6. my_editor ½ÇÇàÈ­¸é

À§ÀÇ ±×¸²Àº ÄÚµùµÈ ÇÁ·Î±×·¥ÀÇ ½ÇÇàÈ­¸éÀÌ´Ù. ¿µ¾î´Â ¹°·ÐÀ̰í ÇѱÛÀԷµµ Àߵǰí, ÆÄÀϺҷ¯¿À±â, ÆÄÀÏÀúÀåµîµµ Á¦´ë·Î ½ÇÇàµÈ´Ù.

À§ÀÇ ÇÁ·Î±×·¥Àº ÃÖ¼ÒÇÑÀÇ ±â´ÉÀ» °¡Áö°í ÀÛµ¿À» ÇÏÁö¸¸, ¿ÏÀüÇÑ ÇÁ·Î±×·¥Àº ¾Æ´Ï´Ù. ÆÄÀÏ ÀúÀåÀü¿¡ Áߺ¹µÇ´Â ÆÄÀÏÀÎÁö °Ë»çÇÏ´Â ±â´ÉÀÌ ¾øÀ¸¸ç, "Exit" ¹öưÀ» Ŭ¸¯ÇßÀ»¶§ º¯°æµÈ ³»¿ëÀ» ÀúÀåÇÒ°ÍÀÎÁö °Ë»çÇÏ´Â ±â´Éµµ ºüÁ®ÀÖ´Ù. ±×¹Û¿¡µµ ¸î°¡Áö ¿¡·¯Ã³¸®¸¦ À§ÇÑ ±â´ÉµéÀÌ ºüÁ®ÀÖ´Ù. ÀÌ·¯ÇÑ ±â´ÉµéÀº ¼÷Á¦·Î ³²°ÜµÎ°í ÀÌ ¹®¼­´Â ¿©±â¿¡¼­ Àϴܶô Áþµµ·Ï ÇϰڴÙ.


3절. °á·Ð

ÀÌ·¸°Ô ÇØ¼­ wxpython ¿¡ ´ëÇÑ °£·«ÇÑ ¼Ò°³¿Í ¾î¶²½ÄÀ¸·Î ÇÁ·Î±×·¡¹ÖÀÌ °¡´ÉÇÑÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ´ÙÀ½¹ø ¹®¼­¿¡¼­´Â À©µµ¿ì¸¦ ¾î¶»°Ô ±¸¼ºÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڽÀ´Ï´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.