'''wxGlade - a GUI builder for wxWidgets'''
http://wxglade.sourceforge.net/tutorial.php ÀÇ ¹ø¿ªº»ÀÌ´Ù.
ÁÖÀÇ : ÀÌ ¹öÁ¯ÀÇ Æ©Å͸®¾óÀº CVSÀÇ ÇöÀç¹öÁ¯¿¡ ¸ÂÃß¾îÁ® ÀÖÀ¸¹Ç·Î ÇöÀçÀÇ wxGladeÀÇ ¸±¸®Áî ¹öÁ¯°ú´Â Â÷ÀÌ°¡ ÀÖÀ» ¼ö ÀÖ´Ù.
'''wxGlade Tutorial'''
ÀÌ Æ©Å͸®¾óÀÇ ¸ñÀûÀº wxGlade¿¡ ´ëÇÑ Àü¹ÝÀûÀÎ »çÇ×°ú ±â´É¿¡ ´ëÇØ ´ë·«ÀûÀ¸·Î ¾Ë¾Æº¸±â À§ÇÑ °ÍÀÌ´Ù.
ªÀº ³»¿ë¿¡µµ ºÒ±¸ÇÏ°í, Â÷±ÙÂ÷±ÙÈ÷ ¸Å´º¹Ù¿Í »óŹ٠±×¸®°í notebook°°Àº ÄÁÆ®·ÑÀÌ Æ÷ÇÔµÈ frameÀ» ¾î¶»°Ô ¸¸µå´ÂÁö¸¦ ÅëÇؼ ¾î¶»°Ô ÇÁ·Î±×·¥ÀÌ µ¿ÀÛÇÏ´ÂÁö¿¡ ´ëÇØ ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.
1. frame »ý¼º
»õ ÇÁ·¹ÀÓÀ» ¸¸µé±â À§Çؼ´Â, "ÆÈ·¿Æ®"¿¡¼ Àû´çÇÑ(¿ªÀÚÁÖ:ÇÁ·¹ÀÓ) ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. »õâ¿¡ ÇØ´çÇϴ Ŭ·¡½ºÀÇ À̸§À» ¿ä±¸Çϴ âÀÌ ¶ã°ÍÀÌ´Ù. À̸§À» ÀÔ·ÂÇϵÇ, ¹Ýµå½Ã pythonÀ̳ª c++ Ŭ·¡½º¿¡ »ç¿ëÇÒ¼ö ÀÖ´Â(¹®¹ýÀûÀ¸·Î ¸Â´Â) À̸§À̾î¾ß ÇÑ´Ù.
ÀÌÁ¦ ÇÁ·¹ÀÓâÀÌ º¸ÀÌ°í, ¼Ó¼ºÃ¢ÀÌ ¹æ±Ý »ý¼ºµÈ widgetÀÇ ¼Ó¼ºÀ» º¸¿©ÁÙ°ÍÀÌ´Ù. ÀÌÁ¦ frameÀÇ Á¦¸ñ(ÇØ´ç ¿ÀºêÁ§Æ®ÀÇ À̸§°ú µ¿ÀÏÇØÁü)À» ¹Ù²Ù¾î º¸ÀÚ. "Frame with notebook" À̶ó°í ÀÔ·ÂÇØ º¸ÀÚ.
Á¦¸ñ ÀԷ¶õÀ» ¹þ¾î³ª¸é ¹Ù·Î Àû¿ëµÇ¾î Áú °ÍÀÌ´Ù.
2. ¸Å´º¹Ù ¸¸µé±â
ÇöÀç ÇÁ·¹ÀÓÀÇ ¼Ó¼ºÃ¢À» ¼±ÅÃÇÑ´Ù. ±×¸®°í ÇØ´ç ÇÁ·¹ÀÓ¿¡¼ ¸Å´º¹Ù »ý¼ºÀ» ¼±ÅÃÇÑ´Ù.
¼Ó¼ºÃ¢ÀÌ º¯Çϸç, ¸Å´º¹ÙÀÇ ¼Ó¼ºÀ» º¸¿©Áֱ⠽ÃÀÛÇÑ´Ù. : ¸Å´º ¹öÆ° ¼öÁ¤À» Ŭ¸¯ÇÏ°í ¸Å´º ¿¡µðÅÍ·Î ¸Å´º¸¦ ¸î°³ Ãß°¡ÇÑ´Ù.
"add" ¹öÆ°À» ´·¯ ¸Å´º¸¦ Ãß°¡ÇÑ´Ù. ±×¸®°í Label Ç׸ñÀ» "File"·Î ¼öÁ¤ÇÑ´Ù.
ÀÌÁ¦ File ¸Å´º¿¡ ÇϺθŴº¸¦ Ãß°¡ÇØ º¸ÀÚ : "Add"¹ö틍¸¦ Ŭ¸¯ÇÏ°í, LabelÇ׸ñÀ» "New"·Î ¹Ù²Û´Ù.
±×¸®°í > ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. : New¸Þ´º°¡ File¸Þ´º ÇϺθ޴º·Î Ç¥½ÃµÇ±â À§ÇØ ¾ÈÂÊÀ¸·Î µé¿©¾²±â µÈ°ÍÀ» º¼ ¼ö ÀÖ´Ù.
3. »óŹ٠¸¸µé±â
ÇÁ·¡ÀÓ ¼Ó¼ºÃ¢(widget ÅÇ)¿¡¼ Has MenuBar ¾Æ·¡¿¡ Has StatusBar¸¦ ¼±ÅÃÇÑ´Ù.
¼Ó¼ºÃ¢Àº ÇöÀç »óŹÙÀÇ ¼Ó¼ºÀ» ³ªÅ¸³»°í ÀÖ´Ù. : ¼öÁ¤Çϱâ À§ÇØ ´õºíŬ¸¯ÇÑ´Ù. "Created with wxGlade!"·Î ¼öÁ¤ÇÑ´Ù. size ¼Ó¼ºÀº ÇØ´ç ¼Ó¼ºÀÇ Â÷¿øÀ» ³ªÅ¸³½´Ù. ÃÖ¼ÒÇÑ ÇϳªÀÇ Çʵå´Â -1ÀÇ °ªÀ» °¡Á®¾ß ÇÑ´Ù.(³²Àº °ø°£À» ¸ðµÎ ä¿ì´Â ÇʵåÀÌ´Ù.)
4. notebook ¸¸µé±â
ÀÌÁ¦, ÇöÀç ÇÁ·¹ÀÓ¿¡ notebookÀ» Ãß°¡ÇØ º¸ÀÚ. Ãß°¡ÇÏ°Ô µÇ¸é ÇöÀç ÇÁ·¹ÀÓÀÌ BoxSizer°¡ ¸· Ãß°¡µÈ°ÍÀ» º¼¼ö ÀÖ´Ù. ±× ÀÌÀ¯´Â ¸ðµç ÄÁÅ×ÀÌ³Ê À§Á¬(container widget)Àº ÇϺΠÀ§Á¬(sub-widgets)À» Ãß°¡Çϱâ À§Çؼ´Â Sizer¸¦ °¡Áö°í ÀÖ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù. ±×¸®°í ÀϹÝÀûÀ¸·Î ÇÁ·¹ÀÓÀº ÇϳªÀÇ ÀÚ½Ä À©µµ¿ì¸¦ °¡Áö°Ô µÇ¹Ç·Î wxGlade´Â 1-solt BoxSizer¸¦ ÀÚµ¿Ãß°¡ ÇÑ´Ù.
ÀÌÁ¦ notebookÀ» Ãß°¡ÇÑ´Ù. ±×·¯±â À§Çؼ´Â ÇÁ·¹ÀÓÀ» ¼±ÅÃÇÑÈÄ ÆÈ·¿Æ®¿¡¼ Notebook ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. ±×¸®°í sizerÀ§·Î µå·¡±× ÇÑ´Ù. ±×·¯°í ³ª¸é notebook ÅÇÀÇ À§Ä¡¸¦ °í¸£´Â âÀÌ ¶á´Ù. ¼±ÅÃÇÑ´Ù.
ÀÌÁ¦ ¼Ó¼ºÃ¢À» ¼±ÅÃÇغ¸. ÀÌÁ¦ Ŭ·¡½º À̸§ÀÌ wxNoteBookÀΰÍÀ» º¼¼öÀÖ´Ù. ´Ù½Ã¸»ÇØ ¿ÀºêÁ§Æ®ÀÇ Å¬·¡½º À̸§ÀÌ´Ù. ¸¸¾à °ªÀ» ¼öÁ¤Çϸé wxNotebook Ŭ·¡½º¸¦ »ó¼Ó¹ÞÀº »õ·Î¿î Ŭ·¡½º¸¦ ¸¸µé°Ô µÈ´Ù.
ÇÁ·Î±×·¥ µ¿À۽ÿ¡´Â ¾Æ¹«·± ¿µÇâÀÌ ¾øÀ¸³ª »õ·Î »ý¼ºµÈ Ŭ·¡½ºÀÇ Á¤ÀÇµÈ Äڵ带 »ý¼ºÇÏ°Ô µÈ´Ù wxGlade°¡ »õ·Î¿î Ŭ·¡½º¸¦ À§ÇÑ Äڵ带 »ý¼ºÇϵµ·Ï, »õ·Î »ý¼ºµÈ MyNotebook Ŭ·¡½ºÀÇ °ªÀ» ¼öÁ¤ÇØ º¸ÀÚ
ÁÖÀÇ : À§ÀÇ ¼³¸íÀº ¼ÒÀ§ "container" widgets ¿¡¸¸ ÇØ´çµÈ´Ù. ´Ù½Ã ¸»ÇØ ÀÚ½ÄÀ» ¼ÒÀ¯ÇÒ¼ö ÀÖ´Â °Í¸¸ ÇØ´çµÈ´Ù. contolÀº ¾à°£ ´Ù¸£´Ù. ¿¹¸¦ µé¸é..
Æгξȿ¡ ¹öÆ°À» ³Ö¾ú´Ù. wxButton Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù. »õ·Î »ý¼ºµÈ MyCustomButtonÀÇ ¾î¶² °ªÀ» ¼öÁ¤Çϸé wxGlade´Â wxButton Ŭ·¡½º¸¦ »ó¼Ó¹ÞÀº MyCustomButtonÀÌ ¾îµò°¡¿¡ Á¤ÀÇ µÇ¾îÀÖ°í, ±× Ŭ·¡½¼´Â ÀϹÝÀûÀÎ wxButton Ŭ·¡½º¿Í ȣȯµÇ´Â »ý¼ºÀÚ¸¦ °¡Á³´Ù°í »ý°¢ÇÏ°í ±× ºÎºÐ¿¡ ´ëÇÑ Äڵ带 »ý¼ºÇÑ´Ù. ¾Æ·¡°¡ ±× ¿¹ÀÌ´Ù.
{{{
button_1 = MyCustomButton(parent, id, "Label")
}}}
instead of
{{{
button_1 = wxButton(parent, id, "Label")
}}}
'''ÁÖÀÇ 2''': XRC Ãâ·Â¿¡ À־ ±âÁ¸ÀÇ °Í°ú Ŭ·¡½ºÀÇ °ªÀÌ ´Ù¸£¸é ±× °´Ã¼°¡ »ó¼Ó¹ÞÀº °ÍÀ̶ó°í »ý°¢ÇÑ´Ù. À§ÀÇ ¿¹Á¦¿¡ ÇØ´çÇÏ´Â Ãâ·ÂÀÌ ´ÙÀ½°ú °°´Ù.
{{{#!vim sgml
}}}
±×·¯¹Ç·Î XRC ouput¿¡¼ ÁÖÀÇÇÒÁ¡Àº ¼ÒÀ§ "top-level" widget(frame, dialog, ...)µéÀ» Ãß°¡ÇÒ¶§ Ŭ·¡½º°ªÀ» ÃʱâÄ¡·Î ¸®¼ÂÇØ¾ß ÇÔÀ» ±â¾ïÇؾßÇÑ´Ù. ±× ÀÌÀ¯´Â wxGlade´Â »ó¼ÓµÈ Ŭ·¡½º·Î ÀνÄÇϱ⠶§¹®ÀÌ´Ù.
5. notebook page Ãß°¡, »èÁ¦ Çϱâ
ÀÌ µ¿ÀÛÀº statusbarÀÇ Çʵ带 ´Ù·ç´Â°Í°ú °ÅÀÇ µ¿ÀÏÇÏ´Ù. notebook controlÀÇ ÅÇ ¼Ó¼ºÀº ÆäÀÌÁöÀÇ °ª°ú ±× Á¦¸ñÀ» ¼³Á¤ÇÑ´Ù.("Apply" Çϴ°ÍÀ» ÀØÁö ¸»¶ó!)
6. ÄÁÆ®·Ñ Ãß°¡Çϱâ.
ÀÌÁ¦ ÀÌ ÂªÀº tutorialÀÇ ¸¶Áö¸· ÆÄÆ®¿¡ µµ´ÞÇß´Ù. : notebookÀÇ Ã¹ÆäÀÌÁö¿¡ ¸î¸î ÄÁÆ®·ÑÀ» Ãß°¡ÇØ º¸ÀÚ.
text area ¿Í µÎ°³ÀÇ ¹öÆ°À» Ãß°¡ÇÒ °ÍÀÌ´Ù. ÀÌ µ¿ÀÛµéÀº sizerµéÀ» ÀÌ¿ëÇؼ °´Ã¼µéÀ» layoutÇϴ°Ͱú wxGladeÀÇ cut & paste Áö¿øÀ» º¸°Ô µÈ´Ù.
Àü¿¡ ¾ê±âÇßµíÀÌ container¾È¿¡ widgetsÀ» Ãß°¡Çϱâ À§Çؼ´Â sizer¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.
ÀÌÁ¦ ÄÜÆ®·ÑµéÀÌ Ãß°¡µÉ notebookÀÇ Ã¹ÆäÀÌÁö¿¡ sizer¸¦ Ãß°¡ÇØ º¸ÀÚ.
ÀÌÁ¦ ÆÈ·¿¿¡¼ BoxSizer ¹öÆ°À» Ŭ¸¯ÇÑ´Ù. ¸¶¿ì½º¸¦ ÆäÀÌÁö ¾ÈÀ¸·Î À̵¿½ÃÅ°¸é Æ÷ÀÎÅÍ°¡ ½ÊÀÚ¸ð¾çÀÌ µÈ´Ù. ±×¸®°í ÆäÀÌÁö¿¡ sizer¸¦ ¶³¾î¶ß¸°´Ù. ÀÌÁ¦ Ãß°¡ÇÒ sizer¿¡ ´ëÇÑ ¸î°¡Áö ¼Ó¼ºÀ» ¹¯´Â âÀÌ ¶ã°ÍÀÌ´Ù. ÇöÀç°ªÀ» ¼öÁ¤ÇÑ´Ù. 2ÄÂ¥¸® vertical box·Î ¸¸µç´Ù. ÀÌ°ÍÀº °Á¦Á¶Ç×Àº ¾Æ´Ï´Ù. sizerÀÇ Ä¼ö´Â ¾ðÁ¦µç ¹Ù²ð¼ö ÀÖ´Ù. ÀüÀڴ Ŭ·¡½º ¼Ó¼ºÀ» ¼öÁ¤ÇÏ´Â °ÍÀÌ°í, ÈÄÀÚ´Â sizerÀÇ "handle"¹öÆ° À§¿¡¼ ¿ìŬ¸¯ Çϰųª widget Æ®¸®¿¡¼ ÇØ´ç ³ëµå¸¦ ÅëÇؼ Æ˾÷¸Þ´º¸¦ ¶ç¿ï ¼ö ÀÖ´Ù. (´Ù½Ã¸»ÇØ. wxGlade¿¡¼´Â °ÅÀÇ ¸ðµç °´Ã¼¿¡ ´ëÇÑ ¸Þ´º¸¦ ÀÌ·±½ÄÀ¸·Î ¶ç¿ï¼ö ÀÖ´Ù.)
TextCtrl ¹öÆ°À» Ŭ¸¯ÇÑÈÄ¿¡ sizerÀÇ Ã¹¹ø° ½½·Ô¿¡ ³Ö¾îº¸ÀÚ.
±âº»Á¤·ÄÀº ¿À¸¥ÂÊÁ¤·ÄÀÌ´Ù. layoutÀ» ¼öÁ¤Çϱâ À§Çؼ´Â TextCtrlÀÇ layout¼Ó¼ºÅÇÀ» ¼±ÅÃÇÑ´Ù. AlignmentÀÇ wxEXPAND °ªÀ» 1·Î ¼öÁ¤ÇÑ´Ù.
¿©·¯ÁÙÀ» Ãâ·ÂÇÏ°í ½ÍÀ¸¸é Style(Widget ÅÇ¿¡¼)ÀÇ wxTE_MULTILINE ÀÇ Ã¼Å©¹Ú½º¸¦ üũÇÑ´Ù. : wxGlade¿¡¼´Â ´ëºÎºÐÀÇ Style ¼Ó¼ºÀÇ ¼öÁ¤Àº ¹Ù·Î º¸ÀÌÁö´Â ¾ÊÁö¸¸ »ý¼ºµÈ Äڵ忡´Â Àû¿ëÀÌ µÈ´Ù.
µÎ¹ø° ½½·Ô¿¡ horizontal SizerÀ» ¹èÄ¡ÇÑ´Ù. ¿©±â´Â ¹öÆ°ÀÌ µÎ°³ µé¾î°£´Ù. ½½·ÔÀÇ ¼ýÀÚ´Â 3À¸·Î ¼öÁ¤ÇÑ´Ù. µÎ ¹öÆ° »çÀÌ¿¡ °ø°£À» ÁÖ±â À§ÇÑ °ÍÀÌ´Ù. (ȸ鿡¼ µÑ »çÀÌ°¡ ³Ê¹« ºÙ°Ô ÇÏÁö ¾Ê±â À§ÇؼÀÌ´Ù.)
ù¹ø° ½½·Ô¿¡ Àû´çÇÑ ¹öÆ°À» »õ·Î ³Ö´Â´Ù. µÎ¹ø° ¹öÆ°À» Ãß°¡Çϱâ À§Çؼ Ŭ¸³º¸µå¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. ù¹ø° ¹öÆ°ÀÇ Æ˾÷¸Þ´º¿¡¼ Copy itemÀ» Ŭ¸¯ÇÑ´Ù.(¾Æ´Ï¸é ±×Àú ¹öÆ°À» ¼±ÅÃÇÑ ÈÄ Ctrl+C¸¦ ´©¸¥´Ù.), ÀÌÁ¦ ¸¶¿ì½º¸¦ ¼¼¹ø° ½½·Ô¿¡¼ ½½·Ô¿¡ Æ˾÷¸Þ´º¿¡¼ º¹»çµÈ widgetÀ» ºÙÀ̱â À§ÇØ Paste itemÀ» Ŭ¸¯ÇÑ´Ù.(¾Æ´Ï¸é, ºó ¼¼¹ø° ½½·ÔÀ» ¼±ÅÃÇÑ ÈÄ Ctrl+V¸¦ ´©·ç°Å³ª, ºó ¼¼¹ø° ½½·Ô¿¡¼ ¸¶¿ì½º ¹öÆ°ÀÌ 3°³¶ó¸é °¡¿îµ¥ ¹öÆ°À» ´©¸£¸é µÈ´Ù.)
Àû´çÇÑ °Å¸®¸¦ À¯ÁöÇϱâ À§ÇØ, ÀÌÁ¦ µÎ ¹öÆ° »çÀÌ¿¡ spacer¸¦ Ãß°¡ÇÑ´Ù.
ÀÌÁ¦ ¸¶Áö¸·À¸·Î ¹öÆ°ÀÌ µé¾îÀÖ´Â horizontal SizerÀÇ ¼Ó¼º¿¡¼ wxEXPAND°ªÀ» 0À¸·Î ¼öÁ¤ÇÏ°í, wxALIGN_CENTER_HORIZONTALÀ» üũÇÏ°í,
¹öÆ°À» text area¿Í ¾Æ·¡ÂÊ notebookÀ¸·Î ºÎÅÍ ºÐ¸®Çϱâ À§ÇØ À§ÂÊ(wxTOP)°ú ¾Æ·¡ÂÊ(wxBOTTOM)ÀÇ border°ªÀ» 4·Î ¼öÁ¤ÇÑ´Ù.
'''NOTE on widgets' ids''': ¸ðµç wxWindows widgetÀº event handlingµî¿¡¼ »ç¿ë µÇ¾îÁö´Â id°ªÀ» °¡Áö°í ÀÖ´Ù.
±×·¯¹Ç·Î wxGladeÀÇ °¢ widgetÀº id ¼Ó¼ºÀ» °¡Áö°í ÀÖ´Ù. ±× °ªÀº ´ÙÀ½°ú °°Àº °ªµéÀÌ ¿Ã ¼ö ÀÖ´Ù.
* a number: widgetÀÇ »ý¼ºÀÚ·Î ºÎÅÍ ¾ò¾îÁø integer°ªÀÌ´Ù.
* a name: ÀÌ °æ¿ì wxGlade´Â ÇÁ·Î±×·¥ ¾îµò°¡¿¡ ¼±¾ðµÈ idÀÇ À̸§À¸·Î »ý°¢ÇÏ°í »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¸é "wxID_OK"À» dialogÀÇ ±âº» OK ¹öÆ°ÀÇ id°ªÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù.
* a pair name=value: ÀÌ °æ¿ì widgetÀÇ »ý¼ºÀÚ°¡ º¯¼ö¸¦ »ý¼ºÇϱâ Àü¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¸é "Test" ¹öÆ°ÀÇ id·Î TEST_BUTTON=wxNewId()À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.(C++ ÄÚµå »ý¼º±ÔÄ¢¿¡ ÀÇÇϸé : constant initializer¿¡ ÀÇÇØ »ý¼ºµÈ id°ªÀÌ anonymous enumÀ¸·Î ÀúÀåµÈ´Ù. ±×·¯¹Ç·Î ÀÌ °æ¿ìÀÇ ÇÒ´çÀº ±ÔÄ¢¿¡ ¾î±ß³ªÁö¸¸ - Àӽ÷ΠTEST_BUTTON=100°ú °°ÀÌ »ç¿ëÇÒ¼ö ÀÖ´Ù.)
* a pair name=?:ÀÌ·± ƯÀÌÇÑ ÇüÅ´ Äڵ尡 "name"¿¡ ÇØ´çÇÏ´Â ¼±¾ðºÎ¸¦ °¡Áö°Ô µÈ´Ù. ÀÚµ¿À¸·Î unique id°¡ ÇÒ´çµÈ´Ù. ÆÄÀ̽㿡¼ "name=wxNewId()"°ú µ¿ÀÏÇÑ ÇüÅÂÀÌ´Ù. C++¿¡¼´Â "name=1000"°ú µ¿ÀÏÇÑ Ç¥ÇöÀÌ´Ù.( ¹°·Ð 1000Àº ´ÜÁö ¿¹¸¦ µç°ÍÀÌ´Ù.) ÈÄÀÚÀÇ °æ¿ì wxGlade´Â ´Â Á¤È®ÇÏ°Ô id°ªÀ» 1000À¸·Î °ªÀ» Á¤ÇÏ·Á°í ÇÒ°ÍÀÌ´Ù. ¸ñÀû¿¡ µû¶ó id°ªÀ» Á¤ÇÏ¸é µÇ°Ú´Ù.
= 7. Last changes =
¸¶Áö¸·À¸·Î, ÇöÀç layoutÀÌ ¸¾¿¡ µéÁö ¾ÊÀ¸¸é, ¹öÆ°µéÀ» test area ¾Æ·¡°¡ ¾Æ´Ï¶ó À§¿¡ µÑ ¼öµµ ÀÖ´Ù.¾î¶»°Ô Çϴ°¡? °£´ÜÇÏ´Ù. : ¹öÆ°µéÀÌ µé¾îÀÖ´Â SizerÀÇ Pos¼Ó¼ºÀ» ¼öÁ¤ÇÑ´Ù. test area ÀÌÀü¿¡ sizer¸¦ µÎ±â À§ÇØ °ªÀ» 0À¸·Î ¼öÁ¤ÇÑ´Ù. ½±Áö ¾ÊÀº°¡?
Now our window is complete: all we have to do is set a reasonable initial size for it. To do this, resize the frame until you find a good size, and then activate the Size property.
= 8. Code generation =
ÄÚµå »ý¼º ÀÌÀü¿¡ ÀúÀåÇÏÀÚ. main wxGlade À©µµ¿ìÀÇ File menu¿¡¼ Save As... À» ¼±ÅÃÇÑ´Ù.¹Ýµå½Ã ÇÊ¿äÇÑ ÀÛ¾÷Àº ¾Æ´ÏÁö¸¸ À§Çè¿ä¼Ò¸¦ ÁÙÀÌ´Â ¾ÆÁÖ ÁÁÀº °øºÎ´Ù. ¾ÆÁ÷ wxGlade´Â ¾ÆÁ÷ ±× Á¤µµ·Î ÇÁ·Î±×·¥ÀÌ ¼º¼÷ÇØ ÀÖÁö´Â ¾Ê´Ù. :-)
ÀÌÁ¦ code¸¦ »ý¼ºÇØ º¸ÀÚ : tree widget¿¡¼ Application Ç׸ñÀ» ¼±ÅÃÇÏÀÚ(¸ÇÀ§¿¡ ÀÖ´Ù.) ¼Ó¼ºÃ¢¿¡ ApplicationÅÇÀÌ º¸ÀδÙ. ÀÌ ÆгÎÀº code generation ¿É¼ÇÀ» °¡Áö°í ÀÖ´Ù.
* Name: wxApp ObjectÀÇ À̸§À» ¼³Á¤ÇÑ´Ù. ÀÌ°ÍÀº ÇÁ·Î±×·¥ÀÇ À̸§ÀÌ µÈ´Ù. ¸¸¾à ÀÌ ¼Ó¼º°ú ´ÙÀ½ ¼Ó¼º(Class)ÀÌ È°¼ºÈ°¡ ¾ÈµÇ¾î ÀÖ´Ù¸é, ±× ÀÌÀ¯´Â appication startup¿¡ ´ëÇÑ Äڵ尡 ¾ø´Â °ÍÀÌ´Ù. ±×·¯³ª ÀÌ°ÍÀº ¸î¸î widget¿¡¸¸ ÇØ´çµÈ´Ù.
* Class: wxApp·Î ºÎÅÍ »ó¼ÓµÈ Ŭ·¡½ºÀÇ À̸§ÀÌ´Ù. ÀÌ ¼Ó¼º°ú ÀÌÀü ¼Ó¼º(Name)ÀÌ È°¼ºÈ°¡ ¾ÈµÇ¾î ÀÖ´Ù¸é application °´Ã¼°¡ wxPySimpleAppÀÏ °ÍÀÌ´Ù.(ÀÌ °ÍÀº Python¾ð¾î¿¡¸¸ ÇØ´çµÈ´Ù. C++ÀÇ °æ¿ì´Â startup Äڵ尡 »ý¼ºµÇ°Ô ÇÏ·Á¸é ¹Ýµå½Ã È°¼ºÈ°¡ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.)
* Encoding: ÀúÀåÇÒ .wxg(¶Ç´Â XRC) ÆÄÀÏ¿¡¼ »ç¿ëµÉ encoding ÀÌ´Ù.
* Enable gettext support: ¸¸¾à üũµÇ¸é, »ý¼ºµÈ ¼Ò½ºÄÚµåÀÇ ¸ðµç ¹®ÀÚ¿Àº "_()"·Î Ãß°¡µÈ ÇüÅ·Π¼öÁ¤µÉ °ÍÀÌ´Ù. ÀÌ°ÍÀº gettext¸¦ À§ÇÑ °ÍÀÌ´Ù.
* Top window: »ý¼ºµÉ ÇÁ·Î±×·¥ÀÇ ÁÖ À©µµ¿ì
* Code generation: Ãâ·Â¿¡ ÇØ´çÇÏ´Â »çÇ×À» Á¶ÀýÇÑ´Ù. ¸ðµç widgetÀ» Æ÷ÇÔÇÏ´Â ÇϳªÀÇ ¼Ò½ºÆÄÀÏÀ» ¸¸µé°ÍÀÎÁö, °¢ Ŭ·¡½º°¡ Á¤ÀÇµÈ µû·Îµû·Î ÆÄÀÏ·Î ¸¸µé°ÍÀÎÁö(C++¿ëÀ¸·Î Ãâ·ÂÇÒ¶§´Â ".h" °ú ".cpp" µÎ°³ÀÇ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù.) Á¤ÇÑ´Ù.
* Language: ¾î¶² ¾ð¾î(Python, C++, XRC(wxWindows ÀÚ¿øÀúÀå¿ë xml Æ÷¸Ë))·Î Äڵ带 »ý¼ºÇÒÁö Á¤ÇÑ´Ù. ¸¶Áö¸· °æ¿ì applicationÀÇ ¸î¸î ¼Ó¼º(Name, Class, Top window)À» ¹«½ÃÇÑ´Ù. ±×¸®°í ¸î¸îÀº ºñÈ°¼ºÈµÈ´Ù. (¿©·¯ ÆÄÀÏ¿¡ ÄÚµå»ý¼ºÀÌ ºÒ°¡´ÉÇÏ´Ù.)
* Overwrite existing sources: ¸¸¾à üũµÇ¸é, ÄÚµå Àüü°¡ ¾÷µ¥ÀÌÆ® µÇÁö ¾Ê°í ´Ù½Ã »ý¼ºµÈ´Ù.(ÀÚ¼¼ÇÑ ³»¿ëÀº ¾Æ·¡ÀÇ Ã¹¹ø° note¸¦ Âü°íÇÑ´Ù.)
* Output path: ´ÜÀÏ ÆÄÀÏ ¸ðµåÀÏ °æ¿ì, »ý¼ºÇÒ ÆÄÀÏ À̸§ÀÌ´Ù. ¿©·¯°³ ÆÄÀÏ·Î »ý¼ºÇÒ °æ¿ì, Ãâ·ÂÇÒ µð·ºÅ丮 ¸íÀÌ´Ù. : ¸¶Áö¸· °æ¿ì, ¸ðµç Custom Ŭ·¡½º´Â °¢ ClassÀÇ À̸§À¸·Î ÆÄÀÏÀÌ »ý¼ºµÈ´Ù. ´Ü wxApp Ŭ·¡½º´Â ¿¹¿ÜÀÌ´Ù. À§¿¡¼ ¼³¸íÇÑ Name ¼Ó¼º°ªÀ¸·Î »ý¼ºµÈ´Ù. ¿¹¸¦ µé¸é notebookÀÇ °æ¿ì MyFrame.py, MyNotebook.py, app.py(Python ÀÏ °æ¿ì)
* Generate code: ÄÚµå »ý¼º ½ÃÀÛ ¹öÆ°
À§¿¡¼ ¼³¸íÇÑ ¿É¼ÇµéÀ» ¼±ÅÃÇÑÈÄ Generate code¹öÆ°À» ´©¸£¸é, Àá½Ã ÈÄ ¸Þ½ÃÁö µ¿ÀÛÀÌ ³¡³µ´Ù´Â ¸Þ½ÃÁö âÀÌ ¶ß°í ÄÚµå »ý¼ºÀÌ ³¡ÀÌ ³´Ù. ¸¶Ä¡ ÀÌ ÂªÀº tutorialó·³.. ;-)
= 9. Notes =
À̹ø¿£ wxGlade¿¡ ´ëÇØ ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÒ °Íµé¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.(¾Ë·ÁÁø ¹ö±×, ÇÑ°è, ¼û°ÜÁø ±â´É, tips and tricks...) tutorial¿¡¼ ´Ù·çÁö ¸øÇß´ø..
Á߿伺¿¡ µû¶ó ´ëÃæ Á¤·ÄÇØ º¸¾Ò´Ù..
Python ¶Ç´Â C++ code¸¦ »ý¼ºÇÒ ¶§, Ãâ·Â ÆÄÀÏÀÌ Á¸ÀçÇϸé, wxGlade´Â ±âº»ÀûÀ¸·Î ¸ðµç ³»¿ëÀ» ÀúÀåÇÏÁö ¾Ê°í, ¾Æ·¡ÀÇ ÄÚµå »çÀÌÀÇ ³»¿ë¸¸ ÀúÀåÇÑ´Ù.
{{{#!vim python
# begin wxGlade: ...
# end wxGlade
}}}
GUIÄڵ带 ´Ù½Ã »ý¼ºÇÒ°æ¿ì, ÀÌ ±â´ÉÀº ´ëºÎºÐÀÇ °æ¿ì ÀÓÀÇ·Î ÀúÀåÇÑ Äڵ带 ÀÒÀ» °ÆÁ¤À» ÇÏÁö ¾Ê°í ÀÛ¾÷ÇÒ ¼ö ÀÖ°Ô ÇØ ÁØ´Ù. ±×·¯³ª ÁÖÀÇÇÒ Á¡ÀÌ Àִµ¥
´ÙÀ½°ú °°Àº »çÇ×À» ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.
* ¸¸¾à Ãâ·ÂÇÒ ÆÄÀÏ¿¡ custom Ŭ·¡½ºÁß °°Àº À̸§ÀÇ Å¬·¡½º°¡ ÀÖÀ» °æ¿ì, ±×¸®°í wxGlade ºí·°ÀÌ ¾ø´Â°æ¿ì, ±× Ŭ·¡½º¿¡ ´ëÇÑ ÄÚµå´Â »ý¼ºµÇÁö ¾Ê´Â´Ù.(shell¿¡¼ °æ°í ¸Þ½ÃÁö´Â Ãâ·ÂµÈ´Ù.)
* ¸¸¾à custom classes Áß À̸§ÀÌ º¯°æÇϸé, »ý¼ºµÈ ÆÄÀÏÀÇ °Íµµ °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. (±×¸®°í wxGlade tagsÀÇ À̸§µµ °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù.)
±× ÀÌÀ¯´Â wxGlade°¡ ¼öÁ¤µÇ±â ÀÌÀüÀÇ À̸§À» ¾Ë ¹æ¹ýÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ±×¸®°í ¿ÏÀüÈ÷ »õ·Î¿î °ÍÀ¸·Î ÀνĵȴÙ. (´Ù½Ã¸»ÇØ ±âÁ¸ÀÇ °ÍÀ» ¼öÁ¤ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »õ·Î »ý¼ºµÈ Ŭ·¡½º·Î ÀνÄÇÏ°í »ý¼ºÇØ ¹ö¸°´Ù.) ¿¹¸¦ µé¸é
MyFrameÀ̶ó´Â Ŭ·¡½º°¡ ÀÖ°í, »ý¼ºµÈ ÆÄÀÏÀº {{{frame.py}}}ÀÌ´Ù.
{{{#!vim python
#!/usr/bin/env python
# generated by wxGlade 0.2 on Sat Dec 14 15:15:06 2002
from wxPython.wx import *
class MyFrame(wxFrame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame.__init__
kwds["style"] = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame.__set_properties
self.SetTitle("frame_1")
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame.__do_layout
pass
# end wxGlade
# end of class MyFrame
}}}
ÀÌÁ¦ MyFrameÀ» RenamedFrameÀ¸·Î À̸§À» º¯°æÇϸé, ¸¸¾à {{{frame.py}}}À» ¼öÁ¤ÇÏÁö ¾Ê´Â´Ù¸é, ±×¸®°í Äڵ带 ´Ù½Ã »ý¼º½ÃŲ´Ù¸é ´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³´Ù.
{{{#!vim python
#!/usr/bin/env python
# generated by wxGlade 0.2 on Sat Dec 14 15:15:06 2002
from wxPython.wx import *
class RenamedFrame(wxFrame):
def __init__(self, *args, **kwds):
# begin wxGlade: RenamedFrame.__init__
kwds["style"] = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)
self.__set_properties()
self.__do_layout()
# end wxGlade
def __set_properties(self):
# begin wxGlade: RenamedFrame.__set_properties
self.SetTitle("frame_1")
# end wxGlade
def __do_layout(self):
# begin wxGlade: RenamedFrame.__do_layout
pass
# end wxGlade
# end of class RenamedFrame
class MyFrame(wxFrame):
def __init__(self, *args, **kwds):
# content of this block not found: did you rename this class?
pass
def __set_properties(self):
# content of this block not found: did you rename this class?
pass
def __do_layout(self):
# content of this block not found: did you rename this class?
pass
# end of class MyFrame
}}}
ÀÌ°ÍÀº ¸í¹éÈ÷ ¿øÇÏ´ø µ¿ÀÛÀÌ ¾Æ´Ï´Ù..
* ¸¸¾à wxg ÆÄÀÏÀÇ custom Ŭ·¡½º¸¦ Á¦°ÅÇϸé, wxGlade´Â¼Ò½ºÄڵ带 Àç»ý¼ºÇÒ¶§¤Ô¤¨¤Â¤ÔÀÚµ¿À¸·Î ¼Ò½ºÄڵ忡¼µµ Á¦°ÅÇÑ´Ù. (ÀÌÀü¹öÁ¯ÀÇ ¼Ò½º°¡ ¾ø´Ù¸é ´ç¿¬È÷ Àû¿ë ¾ÈµÈ´Ù.), ±×·¯³ª wxGlade ºí·°³»ÀÇ Äڵ带 ¾÷µ¥ÀÌÆ® ÇÏ·Á°í ÇÒ°ÍÀÌ´Ù. ÀÌ Àǹ̴ ´ÙÀ½°ú °°´Ù.
* If you want to remove the class, you have to do it manually,
* ¸¸¾à ÀÌ Å¬·¡½º¸¦ Á¦°ÅÇϱ⸦ ¿øÇÑ´Ù¸é, ¼öµ¿À¸·Î ÇؾßÇÒ °ÍÀÌ´Ù.
* If you want to keep the class as is, you have to remove the wxGlade tags.
* ¸¸¾à ÀÌ Å¬·¡½º¸¦ À¯ÁöÇϱ⸦ ¿øÇϸé, wxGlade tags¸¦ Á¦°ÅÇØ¾ß ÇÑ´Ù.
0.3¹öÀü¿¡¼´Â Application ¼Ó¼ºÁß "Overwrite existing sources"À» üũÇÔÀ¸·Î¼ "update contents" ±â´ÉÀ» ²ô´Â °ÍÀÌ °¡´ÉÇÏ´Ù. ¸¸¾à üũ µÇ¾î ÀÖÀ¸¸é wxGlade´Â Äڵ带 ¹Ø¹Ù´ÚºÎÅÍ ´Ù½Ã »ý¼ºÇÑ´Ù. (View->Preferences->Others¿¡¼ Àû´çÇÑ ¹é¾÷±â´ÉÀ» ¼öÇàÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.)
* ÇÁ·Î±×·¥¿¡ »õ·Î¿î Ŭ·¡½º¸¦ Ãß°¡ÇÒ ¶§ ¸¸¾à ÀÌÀü¿¡ »ý¼ºµÈ Äڵ尡 ÀÖ´Ù¸é, »õ Ŭ·¡½ºÀÇ ¼±¾ðºÎ´Â ÀÌÀü Äڵ忡 Ãß°¡µÇÁö´Â ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ°ÍÀº ´ëüÀûÀ¸·Î ¹®Á¦´Â ¾ÈµÈ´Ù. ±×·¯³ª C++ Ãâ·Â¿¡¼´Â ÄÄÆÄÀÏ µÇÁö ¾ÊÀ» ¼ö ÀÖ´Ù. "out of box", ±×·¯¹Ç·Î Á÷Á¢ ¸î°¡Áö ÄÚµå ¼öÁ¤À» ÇØ ÁÖ¾î¾ß ÇÑ´Ù. (e.g. »õ Ŭ·¡½º ÀÌÀü¿¡ ¸î°¡Áö ¼±¾ðÀ» ÇØÁØ´Ù.)
* sizer¿¡ slotÀ» Ãß°¡ÇÒ¶§ »õ·Î¿î ½½·ÔÀÌ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ´Ù. ÀÌ°ÍÀº sizer¸¦ °®°í ÀÖ´Â windowÀÇ »çÀÌÁî°¡ ³Ê¹« ÀÛÀ»¶§ ÀϾ ¼ö ÀÖ´Ù. ±×·¯¹Ç·Î »çÀÌÁ ÀçÁ¶Á¤Çϸé ÇØ°áµÈ´Ù. layoutÀÌ ´Ù½Ã Á¶Á¤µÇ°í »õ·Î¿î slotÀÌ º¸¿©Áø´Ù.
* XRC ÄÚµå »ý¼ºÀº PythonÀ̳ª C++°ú ¸î°¡Áö ´Ù¸¥ Á¡ÀÌ ÀÖ´Ù. section 8¿¡¼ ´Ù·ç¾ú´ø°Í°ú ´Þ¸® Áß¿äÇÑ Á¡Àº..
* ÀϺΠwidgetsÀÌ ÀüÇô Áö¿øµÇÁö ¾Ê´Â´Ù.(e.g. status bar ¿Í gird): ÀÌ ÄÚµåµéÀº »ý¼ºµÇÁö ¾Ê´Â´Ù. ´ë½Å¿¡ XRC output ÆÄÀÏÀº ´ÙÀ½°ú °°Àº comment¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù.
{{{
}}}
* Output ÆÄÀϵéÀº Ç×»ó µ¤¾î¾º¿öÁø´Ù. ±×·¯¹Ç·Î Á÷Á¢ XRC ÆÄÀÏÀ» ¼öÁ¤Çϸé Äڵ带 Àç»ý¼ºÇÒ¶§ Á÷Á¢ ¼öÁ¤ÇÑ °ÍµéÀº ¸ðµÎ »ç¶óÁø´Ù.
* 02.¹öÁ¯ ÀÌÈÄ·Î CustomWidget()À̶ó´Â Ưº°ÇÑ ÄÄÆ÷³ÍÆ®°¡ ÀÖ´Ù. ´Ù¸¥Á¡Àº wxg ÆÄÀϾÈÀÇ ¾î¶² widget¿¡¼´Â ¾²Àϼö ÀÖ´Ù.wxGlade°¡ Áö¿øÇÏÁö Á÷Á¢ Áö¿øÇÏÁö ¾Ê´Â °Í¿¡¼µµ ¾²ÀÏ ¼ö ÀÖ´Ù. °¡Àå Áß¿äÇÑ ±â´ÉÀº Argument ¼Ó¼ºÀÌ´Ù. ÀÌ°ÍÀº Python ¶Ç´Â C++ ¿¡ ´ëÇØ µÎ°¡Áö ´Ù¸¥ Àǹ̰¡ ÀÖ´Ù. °´Ã¼¿¡ ´ëÇØ »ý¼ºÀÚ parameter¸¦ Á¤ÀÇÇÒ¼ö ÀÖ´Ù. ÀÌ°æ¿ì µÎ°³ÀÇ Æ¯º°ÇÑ parameter´Â $parent °ú $id ÀÌ´Ù. ÀÌ°ÍÀº ±× °´Ã¼ÀÇ ½ÇÁ¦ id¿Í ºÎ¸ð·ÎºÎÅÍ ±×µéÀÇ À̸§°ú ÀúÀå¼Ò¸¦ ÃßÃøÇÒ ¼ö ÀÖ´Ù. XRC¿¡ ´ëÇؼ´Â Ưº°ÇÑ Ãß°¡ ¼Ó¼ºÀÌ ÀÖ´Ù. ÀÌ°æ¿ì Æû¿¡¼ ´ÙÀ½°ú °°´Ù.
{{{
name: value
}}}
(invalid entries will be silently ignored): for each of these lines, the output will contain a
{{{
value
}}}
property of the XRC object.
* 0.2 ¹öÁ¯ ºÎÅÍ´Â wxGlade´Â xrc2wxg.py¶ó´Â ½ºÅ©¸³Æ®¸¦ Á¦°øÇÑ´Ù. ÀÌ°ÍÀ¸·Î XRC ÆÄÀÏÀ» wxGlade ÆÄÀÏ·Î º¯È¯ÇÒ ¼ö ÀÖ´Ù. ±×·¯¸é wxGlade¿¡¼ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.
{{{
python xrc2wxg.py xrc_file.xrc wxg_file.wxg
}}}
(¸¸¾à wxg_file.wxg°¡ »ý·«µÇ¸é ±âº»°ªÀ¸·Î xrc_file.wxg°¡ µÈ´Ù.), ±×·¯³ª ÀÌ°ÍÀº ¸î°¡Áö Á¦ÇÑÀ» µÎ°í ÀÖ´Ù.. ¾Ë¾Æº¸ÀÚ.
* ¿ì¼±, ÀÌ°ÍÀº "wxGlade-friendly(wxGlade ȣȯ)" XRC ÆÄÀϵ鸸 ´Ù·ê ¼ö ÀÖ´Ù. ÀÌ°ÍÀº ±âº»ÀûÀ¸·Î ¸ðµç À©µµ¿ì ÃÖ»óÀ§ À©µµ¿ì »©°í, ¹Ýµå½Ã sizer¾È¿¡ Á¸ÀçÇÏ¿©¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. (¿¹¿Ü´Â ÀÖ´Ù.)
* wxGlade°¡ ¸ð¸£´Â ¸ðµç widgetÀº ¹Ýµå½Ã Ưº°ÇÑ CustomWidget ÄÄÆ÷³ÍÆ®·Î ´ëüµÇ¾î¾ß ÇÑ´Ù.
* ¸¶Áö¸·À¸·Î xrc2wxg´Â ±âº»ÀûÀ¸·Î ½ÃÇèÆÇÀÌ´Ù. ±×·¯¹Ç·Î ¹ö±×°¡ ÀÖÀ» ¼ö ÀÖ´Ù. ¸¸¾à¿¡ ¹ß°ßµÇ¸é º¸°íÇ϶ó(this is valid for wxGlade in general, BTW).
* ÄÚµå »ý¼º±â´ÉÀ» GUI¸¦ ¶ç¿ìÁö ¾Ê°í command line¿¡¼ ÇàÇÒ ¼ö ÀÖ´Ù. ½©»ó¿¡¼ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.
{{{
python wxglade.py -h
}}}
at your shell's prompt.
ÀÌ ³»¿ëÀÌ ¾Ë±â ½±±â¸¦ ¹Ù¶õ´Ù.. ³ªÀÇ ¿µ¾î´Â ´Ù¼Ò ¹ÌÈíÇÏ´Ù. ¾î°µç Áú¹®, comment, ºñÆòÀº e-mailÀ» ÅëÇÒ ¼ö ÀÖ´Ù.
[agriggio users sf net].
Alberto Griggio
¹ø¿ª : ½É½ÂÁØ, dwYoon¾È
dwYoon´Ô Á¤¸®ÇØ Áּż °¨»çÇÕ´Ï´Ù.