· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Wxglade-Tutorial

wxGlade - a GUI builder for wxWidgets



ÁÖÀÇ : ÀÌ ¹öÁ¯ÀÇ Æ©Å͸®¾óÀº 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 Ãâ·Â¿¡ À־´Â ±âÁ¸ÀÇ °Í°ú Ŭ·¡½ºÀÇ °ªÀÌ ´Ù¸£¸é ±× °´Ã¼°¡ »ó¼Ó¹ÞÀº °ÍÀ̶ó°í »ý°¢ÇÑ´Ù. À§ÀÇ ¿¹Á¦¿¡ ÇØ´çÇÏ´Â Ãâ·ÂÀÌ ´ÙÀ½°ú °°´Ù.
 <object class="wxButton" name="button_1" subclass="MyCustomButton"/> 

±×·¯¹Ç·Î 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´Â ±âº»ÀûÀ¸·Î ¸ðµç ³»¿ëÀ» ÀúÀåÇÏÁö ¾Ê°í, ¾Æ·¡ÀÇ ÄÚµå »çÀÌÀÇ ³»¿ë¸¸ ÀúÀåÇÑ´Ù.
  # begin wxGlade: ...
  # end wxGlade
 
GUIÄڵ带 ´Ù½Ã »ý¼ºÇÒ°æ¿ì, ÀÌ ±â´ÉÀº ´ëºÎºÐÀÇ °æ¿ì ÀÓÀÇ·Î ÀúÀåÇÑ Äڵ带 ÀÒÀ» °ÆÁ¤À» ÇÏÁö ¾Ê°í ÀÛ¾÷ÇÒ ¼ö ÀÖ°Ô ÇØ ÁØ´Ù. ±×·¯³ª ÁÖÀÇÇÒ Á¡ÀÌ Àִµ¥ ´ÙÀ½°ú °°Àº »çÇ×À» ÁÖÀÇ ÇØ¾ß ÇÑ´Ù.
  • ¸¸¾à Ãâ·ÂÇÒ ÆÄÀÏ¿¡ custom Ŭ·¡½ºÁß °°Àº À̸§ÀÇ Å¬·¡½º°¡ ÀÖÀ» °æ¿ì, ±×¸®°í wxGlade ºí·°ÀÌ ¾ø´Â°æ¿ì, ±× Ŭ·¡½º¿¡ ´ëÇÑ ÄÚµå´Â »ý¼ºµÇÁö ¾Ê´Â´Ù.(shell¿¡¼­ °æ°í ¸Þ½ÃÁö´Â Ãâ·ÂµÈ´Ù.)
  • ¸¸¾à custom classes Áß À̸§ÀÌ º¯°æÇϸé, »ý¼ºµÈ ÆÄÀÏÀÇ °Íµµ °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. (±×¸®°í wxGlade tagsÀÇ À̸§µµ °°ÀÌ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù.) ±× ÀÌÀ¯´Â wxGlade°¡ ¼öÁ¤µÇ±â ÀÌÀüÀÇ À̸§À» ¾Ë ¹æ¹ýÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. ±×¸®°í ¿ÏÀüÈ÷ »õ·Î¿î °ÍÀ¸·Î ÀνĵȴÙ. (´Ù½Ã¸»ÇØ ±âÁ¸ÀÇ °ÍÀ» ¼öÁ¤ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó »õ·Î »ý¼ºµÈ Ŭ·¡½º·Î ÀνÄÇÏ°í »ý¼ºÇØ ¹ö¸°´Ù.) ¿¹¸¦ µé¸é MyFrameÀ̶ó´Â Ŭ·¡½º°¡ ÀÖ°í, »ý¼ºµÈ ÆÄÀÏÀº frame.pyÀÌ´Ù.
    #!/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À» ¼öÁ¤ÇÏÁö ¾Ê´Â´Ù¸é, ±×¸®°í Äڵ带 ´Ù½Ã »ý¼º½ÃŲ´Ù¸é ´ÙÀ½°ú °°Àº °á°ú°¡ ³ªÅ¸³­´Ù.
    #!/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¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù.
      <!-- code generator for wxStatusBar objects not available -->
        

    • 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
    <name>value</name>
     
    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 <at> users <dot> sf <dot> net.


Alberto Griggio


¹ø¿ª : ½É½ÂÁØ, dwYoon¾È


dwYoon´Ô Á¤¸®ÇØ Áּż­ °¨»çÇÕ´Ï´Ù.

ID
Password
Join
Let him who takes the Plunge remember to return it by Tuesday.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2006-06-04 22:23:21
Processing time 0.0094 sec