Frame, Panel

Python : 2008. 11. 25. 20:45
반응형
간단한 예제

우리는 매우 간단한 예제를 시작하겠습니다. 우리의 첫번때 스크립트는 간단한 윈도우를 보여줍니다. 그것은 많은것을 하지 않습니다. 우리는 예제를 한줄씩 분석할 것입니다. 아래가 코드입니다
  1. #!/usr/bin/python 
  2.  
  3. # simple.py 
  4.  
  5. import wx  
  6.  
  7. app = wx.App()  
  8.  
  9. frame = wx.Frame(None, -1, 'simple.py')  
  10. frame.Show()  
  11.  
  12. app.MainLoop()  


#!/usr/bin/python

# simple.py


첫번째 줄은 파이썬 인터프리터의 경로이다. 두번째 줄은 주석이다. 그것은 스크립트의 이름을 제공한다.

import wx


이 줄은 기본적인 wxPython 모듈은 가져온다. core, controls, gdi, misc, window가 그것이다. 기술적으로 wx는 이름공간(namespace)이다. 기본 모듈의 모든 함수와 객체는 wx로 시작한다. 다음 줄은 어플리케이션 객체를 만드는 코드다.

app = wx.App()


각각의 wxPython 프로그램은 하나의 어플리케이션 객체를 가져야한다.

frame = wx.Frame(None, -1, 'simple.py')
frame.Show()


우리는 wx.Frame 객체를 만들었다. wx.Frame 위젯은 중요한 컨테이너 위젯입니다. 우리는 이 위젯을 나중에 자세하게 분석할 것입니다. wx.Frame 위젯은 다른 위젯의 부모 위젯입니다. 그것 자체의 부모는 가지고 있지않다. 만약 우리가 None를 부모 인자로 열거하면 그 위젯은 부모를 가지고 있지 않다는 것입니다. 그것은 위젯 게층에서 최상위 위젯입니다. 나중에 우리는 wx.Frame 위젯을 만들고, Show() 메소르를 실행해서 그것을 화면에 보이게 해야합니다.

app.Main.Loop()


마지막 줄은 mainloop에 들어갑니다. 메인루프는 끝없는 순환입니다. 그것은 어플리케이션이 살아있는동안 존재하는 모든 이벤트를 잡아내고 처리합니다.

이것은 매우 간단한 예제입니다. 그럼에도 불구하고 우리는 이 창으로 많은것을 할수있습니다. 우리는 윈도우의 크기를 조절하거나 최소화, 최대화할수 있습니다. 기능적으로 그것은 많은 코딩을 필요로합니다. 모든 것은 숨겨져있고 wxPython툴킷에 의해 기본적으로 제공됩니다. 바퀴를 재발명할 이유는 없습니다.

사용자 삽입 이미지

wx.Frame


wx.Frame 위젯은 wxPython에서 가장 중요한 위젯 중 하나입니다. 그것은 컨테이너 위젯입니다. 이것은 다른 위젯을 포함할 수 있다는 것을 의미합니다. 그것은 프레임과 다이얼로그를 제외한 어떤 윈도우든지 포함할 수 있습니다. wx.Frame는 타이틀바, 경계선, 중안 컨터이너 영역을 포함합니다. 타이틀바와 경계는 옵션입니다. 그것은 다양한 플래그로 제거될수 있습니다

wx.Frame는 다음의 생성자를 갖고있습니다. 보다시피 그것은 7개의 인자를 갖습니다. 첫번째 인자는 초기값이 없습니다. 다른 6개의 인자는 갖고있습니다. 4개의 인자는 옵션입니다. 처음의 3개는 필수입니다

wx.Frame(wx.Window parent, int id=-1, string title='', wx.Point pos = wx.DefaultPosition, wx.Size size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE, string name = "frame")

wx.DEFAULT_FRAME_STYLE 는 초기 플래그의 모입입니다. wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX | wx.CLIP_CHILDREN. 다양한 스타일을 조합함으로써 우리는 wx.Frame의 스타일을 변화시킬수 있습니다. 다음은 짧은 예제입니다.
  1. #!/usr/bin/python 
  2.  
  3. # nominimizebox.py 
  4.  
  5. import wx  
  6.  
  7. app = wx.App()  
  8. window = wx.Frame(None, style=wx.MAXIMIZE_BOX | wx.RESIZE_BORDER  
  9.     | wx.SYSTEM_MENU | wx.CAPTION |  wx.CLOSE_BOX)  
  10. window.Show(True)  
  11.  
  12. app.MainLoop()  
우리의 의도는 최소화 박스가 없는 윈도우를 보여주는 것입니다. 그래서 우리는 이 플래그를 스타일 인자에 나열하지 않았습니다.

사용자 삽입 이미지


크기와 위치

우리는 우리 어플리케이션의 크기를 2가지 방법으로 지정할수 있습니다. 우리는 위젯의 생성자의 크기 인자를 사용할수 있습니다. 또는 우리는 SetSize()메소트를 부를수 있습니다
  1. #!/usr/bin/python 
  2.  
  3. # size.py 
  4.  
  5. import wx  
  6.  
  7. class Size(wx.Frame):  
  8.     def __init__(self, parent, id, title):  
  9.         wx.Frame.__init__(self, parent, id, title, size=(250, 200))  
  10.  
  11.         self.Show(True)  
  12.  
  13.  
  14. app = wx.App()  
  15. Size(None, -1, 'Size')  
  16. app.MainLoop()  
wx.Frame.__init__(self, parent, id, title, size=(250, 200))


생성자에서 우리는 wx.Frame 위젯의 폭을 250px, 높이를 200px로 설정했습니다.

유사하게, 우리는 화면에서 어플리케이션의 위치도 지정할수 있습니다. 기본적으로 윈도우는 화면의 왼쪽 상단에 위치합니다. 그러나 다양한 운영체제나 창 관리자에 따라서 달라질수 있습니다. 어떤 윈도우 매니저는 어플리케이션 윈도우를 그들 스스로 위치시킵니다. 그들중 어떤 것은 윈도우가 겹치지 않게 최적화합니다. 프로그래머는 윈도우는 프로그램에 따라서 배치시킬수 있습니다. 우리는 이미 wx.Frame 위젯의 생성자의 pos 인자를 봤습니다. 초기값을 제공함으로써 우리는 위치를 조절할수 있습니다


Method Description
Move(wx.Point point) 윈도우를 지정한 위치로 이동시킵니다
MoveXY(int x, int y) 윈도우를 지정한 위치로 이동시킵니다
SetPosition(wx.Point point) 윈도우의 위치를 설정합니다
SetDimensions(wx.Point point, wx.Size size) 윈도우의 위치, 크기를 설정합니다

이것을 할수 있는 몇가지 메소드가 있다. 동전을 던져라(?)
  1. #!/usr/bin/python  
  2.  
  3. # move.py  
  4.  
  5. import wx  
  6.  
  7. class Move(wx.Frame):  
  8.     def __init__(self, parent, id, title):  
  9.         wx.Frame.__init__(self, parent, id, title)  
  10.  
  11.         self.Move((800, 250))  
  12.         self.Show(True)  
  13.  
  14.  
  15. app = wx.App()  
  16. Move(None, -1, 'Move')  
  17. app.MainLoop()  


하나의 특별한 상황이 있다. 우리가 윈도우를 최대하 하고자 한다고 가정하자. 이 경우, 창은 (0,0)에 위치하고 전제 화면을 차지한다. wxPython은 내부적으로 화면 좌표를 계산한다. wx.Frame 을 최대화 하기 위해서, 우리는 Maximize() 메소드를 부른다. 만약, 우리가 어플리케이션을 화면에 중앙에 위치하려면 wxPython은 알맞은 메소드를 가지고 있다. Centre() 메소드를 간단하게 윈도우를 화면의 중앙에 위치시킨다. 화면의 폭, 높이를 계산할 필요는 없다. 단순히 메소드를 불러라

  1. #!/usr/bin/python  
  2.  
  3. # centre.py  
  4.  
  5. import wx  
  6.  
  7. class Centre(wx.Frame):  
  8.     def __init__(self, parent, id, title):  
  9.         wx.Frame.__init__(self, parent, id, title)  
  10.  
  11.         self.Centre()  
  12.         self.Show(True)  
  13.  
  14. app = wx.App()  
  15. Centre(None, -1, 'Centre')  
  16. app.MainLoop()  


widgets communicate(위젯 통신)

어플리케이션에서 어떻게 위젯이 통신하는지 아는것은 중요하다. 다음 예제를 보라

  1. #!/usr/bin/python  
  2.  
  3. # communicate.py  
  4.  
  5. import wx  
  6.  
  7.  
  8. class LeftPanel(wx.Panel):  
  9.     def __init__(self, parent, id):  
  10.         wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)  
  11.  
  12.         self.text = parent.GetParent().rightPanel.text  
  13.  
  14.         button1 = wx.Button(self, -1, '+', (10, 10))  
  15.         button2 = wx.Button(self, -1, '-', (10, 60))  
  16.  
  17.         self.Bind(wx.EVT_BUTTON, self.OnPlus, id=button1.GetId())  
  18.         self.Bind(wx.EVT_BUTTON, self.OnMinus, id=button2.GetId())  
  19.  
  20.     def OnPlus(self, event):  
  21.         value = int(self.text.GetLabel())  
  22.         value = value + 1 
  23.         self.text.SetLabel(str(value))  
  24.  
  25.     def OnMinus(self, event):  
  26.         value = int(self.text.GetLabel())  
  27.         value = value - 1 
  28.         self.text.SetLabel(str(value))  
  29.  
  30.  
  31. class RightPanel(wx.Panel):  
  32.     def __init__(self, parent, id):  
  33.         wx.Panel.__init__(self, parent, id, style=wx.BORDER_SUNKEN)  
  34.         self.text = wx.StaticText(self, -1, '0', (40, 60))  
  35.  
  36.  
  37. class Communicate(wx.Frame):  
  38.     def __init__(self, parent, id, title):  
  39.         wx.Frame.__init__(self, parent, id, title, size=(280, 200))  
  40.  
  41.         panel = wx.Panel(self, -1)  
  42.         self.rightPanel = RightPanel(panel, -1)  
  43.  
  44.         leftPanel = LeftPanel(panel, -1)  
  45.  
  46.         hbox = wx.BoxSizer()  
  47.         hbox.Add(leftPanel, 1, wx.EXPAND | wx.ALL, 5)  
  48.         hbox.Add(self.rightPanel, 1, wx.EXPAND | wx.ALL, 5)  
  49.  
  50.         panel.SetSizer(hbox)   
  51.         self.Centre()  
  52.         self.Show(True)  
  53.  
  54. app = wx.App()  
  55. Communicate(None, -1, 'widgets communicate')  
  56. app.MainLoop()  


우리의 예제는 2개의 패널을 가지고 있다. 왼쪽과 오른쪽 패널이다. 왼쪽 패널은 2개의 버튼을 가지고 있다. 오른쪽 패널은 한개의 정적 텍스트를 가지고 있다. 버튼은 정적 텍스트에 나오는 수를 바꾼다. 질문은, 어떻게 정적 텍스트의 레퍼런스를 갖는냐는 점이다.

만약 모든 위젯이 한 클래스에 존재하면 그것은 당연한 것이다. 그러나 만약 위젯들이 다른 클래스에서 만들어진다면? 이런 상황엥서 우리는 계층을 통해서 레퍼런스를 얻어야 한다.

panel = wx.Panel(self, -1) self.rightPanel = RightPanel(panel, -1) leftPanel = LeftPanel(panel, -1)


오른쪽 패널이 왼쪽 패널보다 전에 정의되야한다는 점을 주목하라. 이것은 왼쪽 패널의 생성자가 실행되는 동안 오른쪽 패널에 정의된 정적 텍스트를 찾기 때문이다. 논리적으로 우리는 존재하지 않는 위젯의 레퍼런스를 얻을수 없다.

self.text = parent.GetParent().rightPanel.text


답은 여기에 있다. 각가의 위젯은 부모 인자를 가지고 있다. 우리의 예제에서 부모는 보여지는 왼쪽과 오른쪽 패널이 위에 있는 패널이다. GetParent()를 부름으로써 우리는 프레임 위젯의 레퍼런스를 얻을수있다. 프레임 위젯은 오른쪽 패널의 레퍼런스를 가지고 있다. 마지막으로 오른쪽 패널은 정적 텍스트 위젯의 레퍼런스를 가지고 있다.

사용자 삽입 이미지


원문 : http://zetcode.com/wxpython/firststeps/
반응형

'Python' 카테고리의 다른 글

트레이 아이콘  (0) 2008.11.25
COF_FTP 다운프로그램 소스코드  (0) 2008.10.05
Py2exe 파일 하나로 만드는 스크립트  (0) 2008.10.04
Posted by Real_G