반응형

1. 소개

    ① 개요

    - 넘파이는 Numerical Python의 합성어. (Numerical : 수의, 수와 관련된, 숫자로 나타낸)

    - 이름에서 알 수 있듯이 넘파이는 수와 관련된 부분을 지원하는 라이브러리임을 알 수 있다.

    - 주로 행렬이나 다차원 배열을 쉽게 처리하고 고속의 연산을 수행할 수 있도록 지원하는 파이썬 라이브러리이다.

    - 그러다보니 머신러닝, 딥러닝, 데이터 분석 및 과학 분야에서 많이 사용된다.

 

2. import, version, array, shape

    ① numpy import

1
2
3
# python에서 numpy 임포트 하기
>>> # numpy import
>>> import numpy as np
cs

 

    ② numpy version 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.2.    numpy version 확인
>>> # numpy import
>>> import numpy as np
>>>
>>> np._version_
Traceback (most recent call last):
  File "<pyshell#73>", line 1in <module>
    np._version_
  File "C:\Users\web\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\__init__.py", line 219in __getattr__
    raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute '_version_'
>>> 
>>> np.__version__
'1.18.5'
>>>
cs

 

    ③ np.array를 이용하여 numpy array 생성

1
2
3
4
5
6
7
8
9
>>> # numpy를 이용하여 1차원 배열 만들기
>>> ar1 = np.array( [ 12345 ] )
>>> ar1
array([12345])
 
# 배열의 모양(형태)을 알 수 있다.
>>> ar1.shape
(5,)
 
cs

 

1
2
3
4
5
6
7
8
9
# 파이선 리스트 변수를 만들어 삽입도 가능
>>> lst = [ 678910 ]
>>> ar2 = np.array(lst)
 
>>> ar2
array([ 6,  7,  8,  910])
 
>>> ar2.shape
(5,)
cs

 

    ④ shape 명령어로 np.array 형태 확인

1
2
3
4
5
6
7
8
9
10
11
12
# 1차원 np.array 형태
>>> arr1 = np.array( [123] )
>>> arr1.shape
(3,)
 
>>> arr2 = np.array( ['a''b''c'] )
>>> arr2.shape
(3,)
 
>>> arr3 = np.array( [123'a''b''c'] )
>>> arr3.shape
(6,)
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 다차원 np.array 형태
>>> arr1 = np.array( [123], [456] )
Traceback (most recent call last):
  File "<pyshell#81>", line 1in <module>
    arr1 = np.array( [123], [456] )
TypeError: data type not understood
 
>>> arr1 = np.array( [[123], [456]] )
>>> arr1.shape
(23)
 
>>> arr2 = np.array( [[1234], [5678], [9101112]] )
>>> arr2.shape
(34)
 
>>> arr3 = np.array( [[123], [567], [101112]] )
>>> arr3.shape
(33)
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 넘파이 배열 출력
>>> arr1
array([[123],
       [456]])
 
>>> arr2
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9101112]])
 
>>> arr3
array([[ 1,  2,  3],
      [ 5,  6,  7],
       [101112]])
 
>>> print(arr1)
[[1 2 3]
 [4 5 6]]
 
>>> print(arr2)
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
cs

 

3. type, size, ndim

    ① type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# list type과 numpy.ndarray type
>>> arr = [ 1234 ]
>>> arr
[1234]
 
>>> type(arr)
<class 'list'>
 
>>> ndarr = np.array( arr )
>>> ndarr
array([1234])
 
>>> type(ndarr)
<class 'numpy.ndarray'>
 
>>> ndarr.shape
(4,)
 
>>> arr.shape
Traceback (most recent call last):
  File "<pyshell#147>", line 1in <module>
    arr.shape
AttributeError: 'list' object has no attribute 'shape'
 
cs

 

    ② size

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# numpy.array의 size
>>> arr1
array([[123],
       [456]])
 
>>> arr1.size
6
 
>>> arr2
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9101112]])
 
>>> arr2.size
12
 
>>> arr3
array([[ 1,  2,  3],
       [ 5,  6,  7],
       [101112]])
 
>>> arr3.size
9
 
>>> arr3.shape
(33)
cs

 

    ③ ndim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# numpy.array의 차원 확인
 
# 배열의 차원만 알고자 할 때 ndim 사용
>>> a = np.array( [[ 123 ], [ 456 ]] )
>>> a
array([[123],
       [456]])
 
# size는 차원에 대한 정보를 전혀 알 수 없음.
>>> a.size
6 
 
# shape으로도 알 수 있음.
>>> a.shape 
(23)
 
# 차원만 출력.
>>> a.ndim 
2
cs

 

    ④ sizelen의 차이점

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# size : numpy array의 원소의 개수를 출력
# len() : numpy array의 행의 개수를 출력. 차원을 의미하는 것이 아님에 주의.
 
>>> import numpy as np
>>> lst = [[123], [456], [789]]
>>> ndarr = np.array( lst )
 
>>> ndarr
array([[123],
       [456],
       [789]])
 
>>> print(ndarr)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
 
>>> ndarr.size
9
 
>>> len(ndarr)
3
cs

 

shape 결과 값이 행과 열의 값으로 출력된다는걸 알았는데요. 예를들어, arr1 경우 shape 출력값이 (2, 4) 나오는데 arr2 경우 분명히 1 x 5열로 구성된 같은데 shape 메서드로 찍으면 결과가 (5,) 출력되는 이유는 무엇인가? (1, 5) 출력되는 것이 맞지 않나?

☞ 1행으로만 구성된 경우, 생략되기 때문이다.

 

    ⑤ identical type

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# numpy 행렬의 모든 요소는 동일한 데이터 타입으로 통일
#     파이썬 list 보다 연산 처리 속도가 빠르다.
 
>>> arr3 = np.array( [123'a''b''c'] )
>>> arr3[0]
______
>>> 
>>> type(arr3[0])
<class ‘_________________'>
>>> 
>>> lst = [ 1, 2, 3, 'a', 'b', 'c' ]
>>> lst
[1, 2, 3, 'a', 'b', 'c']
>>> 
>>> lst[0]
1
>>> 
>>> type(lst[0])
<class 'int'>
cs

 

4. 다차원 배열

    ① 다차원 배열의 크기, 차원, 길이, 요소

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 다차원 배열: 배열의 배열
# np.shape(arr)
>>> import numpy as np
>>> a = np.array( [[ 123 ], [ 456 ]] )
>>> 
>>> a.shape
(23)
 
>>> a.ndim
2
 
>>> a.size
6
 
>>> len(a)
2
 
>>> a[ 10 ]
4
 
>>> a[ 12 ]
6
 
>>> a[ 02 ]
3
 
cs

 

    ② shape으로 행과 열 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# shape로 행, 열만 구하기
# arr.shape[0]
>>> arr = np.array( [[ 123 ], [ 456 ]] )
>>> 
>>> arr
array([[123],
       [456]])
>>> 
>>> arr.shape
(23)
>>> 
>>> arr.shape[0]
2
>>> 
>>> arr.shape[1]
3
>>> 
>>> 
>>> np.shape( [[ 123 ], [ 456]] )
(23)
>>> arr.shape[2]
Traceback (most recent call last):
  File "<pyshell#208>", line 1in <module>
    arr.shape[2]
IndexError: tuple index out of range
cs

 

    ③ 행렬 재배열

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 구조 변경 : .reshape(행,열)
>>> arr = np.array( [[ 123456 ], [ 123456 ]] )
>>> arr
array([[123456],
       [123456]])
 
>>> print(arr)
[[1 2 3 4 5 6]
 [1 2 3 4 5 6]]
 
>>> # 3 x 4 shape change
>>> arr = np.array( [[ 123456 ], [ 123456 ]] ).reshape( 34 )
 
>>> arr
array([[1234],
       [5612],
       [3456]])
 
>>> arr.shape
(34)
cs

 

5. 행렬의 종류

    ① 영행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .zeros(행, 열)
# 모든 요소를 0으로 갖는 행렬 생성
>>> arr = np.zeros( (22) )
>>> arr
array([[0.0.],
       [0.0.]])
 
>>> arr = np.zeros( (34) )
>>> arr
array([[0.0.0.0.],
       [0.0.0.0.],
       [0.0.0.0.]])
 
# 행렬간의 연산(+, -, *) 결과 값을 저장할 때
# 처음에 0으로 만들어야 할 때
 
cs

 

    ② 일행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
# .ones(행, 열)
# 모든 요소를 1로 갖는 행렬 생성
>>> arr = np.ones( (22) )
>>> arr
array([[1.1.],
       [1.1.]])
 
>>> arr = np.ones( (34) )
>>> arr
array([[1.1.1.1.],
       [1.1.1.1.],
       [1.1.1.1.]])
 
cs

 

    ③ 단위 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# .eye(행)
# 단위 행렬(identity matrix) : 
주대각선(Main diagonal)의 원소가 모두 1이고, 다른 요소들은 0으로 하는
정사각형 행렬
# 1차 단위행렬
>>> arr = np.eye(1)
>>> arr
array([[1.]])
 
# 2차 단위행렬
>>> arr = np.eye(2)
>>> arr
array([[1.0.],
       [0.1.]])
 
# 3차 단위행렬
>>> arr = np.eye(3)
>>> arr
array([[1.0.0.],
       [0.1.0.],
       [0.0.1.]])
 
# 4차 단위행렬
>>> arr = np.eye(4)
>>> arr
array([[1.0.0.0.],
       [0.1.0.0.],
       [0.0.1.0.],
       [0.0.0.1.]])
 
cs

 

6. 행렬의 연산

    ① 행렬 곱셈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# np.dot()
# 행렬의 곱셈
>>> ar1 = np.eye(2)
>>> ar2 = np.array( [[34,], [56]] )
>>> ar1
array([[1.0.],
       [0.1.]])
>>> ar2
array([[34],
       [56]])
 
>>> ar1xar2 = np.dot( ar1, ar2 )
>>> ar1xar2
array([[3.4.],
       [5.6.]])
 
>>> test = ar1 * ar2
>>> test
array([[3.0.],
       [0.6.]])
cs

 

7. 행렬 생성

    ① 범위, 간격 지정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# np.arange(시작, 종료, 간격)
# arange로 원하는 숫자 범위, 간격을 지정.
>>> arr = np.arange(10#python range
>>> arr
array([0123456789])
 
>>> arr = np.arange(20)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  910111213141516,
       171819])
 
>>> arr = np.arange( 0103 )
>>> arr
array([0369])
 
>>> arr = np.arange( 1202 )
>>> arr
array([ 1,  3,  5,  7,  91113151719])
cs

 

    ② 짝수, 홀수를 요소로 갖는 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# np.arange(시작, 종료, 간격)
# 짝수 출력, 0.5 간격
>>> arr = np.arange( 0202 )
>>> arr
array([ 0,  2,  4,  6,  81012141618])
 
>>> arr = np.arange( 0212 )
>>> arr
array([ 0,  2,  4,  6,  8101214161820])
 
arr = np.arange( 110, .5 )
>>> arr
array([1. , 1.52. , 2.53. , 3.54. , 4.55. , 5.56. , 6.57. ,
       7.58. , 8.59. , 9.5])
 
cs

 

    ③ 범위, 간격, shape을 이용한 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# .arange()와 .rehape()을 이용하여 3Ⅹ3 행렬 만들기
>>> arr = np.array( [[123], [456], [789]] )
>>> arr
array([[123],
       [456],
       [789]])
 
>>> arr.shape
(33)
 
>>> arr.arange(9)
Traceback (most recent call last):
  File "<pyshell#491>", line 1in <module>
    arr.arange(9)
AttributeError: 'numpy.ndarray' object has no attribute 'arange'
 
>>> arr_new = np.arange(9)
>>> arr_new
array([012345678])
 
>>> arr_new.reshape( 33 )
array([[012],
       [345],
       [678]])
 
cs

 

    ④ arrange()reshape() 조합

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# arrange() 배열 생성 후 reshape()
# 6 x 6 행렬
 
>>> arr = np.arange( 137 )
>>> arr
array([ 1,  2,  3,  4,  5,  6,  7,  8,  91011121314151617,
       1819202122232425262728293031323334,
       3536])
 
>>> arr = arr.reshape(66)
>>> arr
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9101112],
       [131415161718],
       [192021222324],
       [252627282930],
       [313233343536]])
 
cs

 

    ⑤ reshape(-1, n[])

        - .reshape(-1, n) 또는 .reshape(n, -1) 메소드는 주어진 배열의 요소 사이즈와 연관성이 높다.
        -  배열에 있는 요소가 재배열 되려는 배열의 모양구조에 빠짐없이 배분이 되어질 수 있느냐 없느냐가 중요한 핵심이다.
        -  제대로 분배가 안되어지는 경우의 모양은 에러가 발생한다.
        -  예를들어, 12개 배열 요소에서 .reshape(-1, 5) 혹은 .reshape(7, -1)로 재배열하려고 한면 에러가 발생한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# .reshape(-1, 열)
# shape( -1, n[정수] )
>>> ar = np.arange(12).reshape(34)
>>> ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar1 = ar.reshape(-11)
>>> ar1
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
# (-1, 1) == (12, 1)
>>> ar2 = ar.reshape( -12 )
>>> ar2
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [1011]])
 
>>> ar3 = ar.reshape( -13 )
>>> ar3
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011]])
 
>>> ar4 = ar.reshape( -15 )
Traceback (most recent call last):
  File "<pyshell#855>", line 1in <module>
    ar4 = ar.reshape( -15 )
ValueError: cannot reshape array of size 12 into shape (5)
 
>>> ar3 = ar.reshape( -16 ) # == (2, 6)
>>> ar3
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  91011]])
 
cs

 

    ⑥ reshape(n[], -1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# .reshape(행, -1)
# shape( n[정수], -1 )
>>> ar = np.arange(12)
 
>>> ar1 = ar.reshape(1-1)
>>> ar1
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011]])
 
>>> ar2 = ar.reshape(2-1)
>>> ar2
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  91011]])
 
>>> ar3 = ar.reshape(3-1)
>>> ar3
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar5 = ar.reshape(5-1)
Traceback (most recent call last):
    ar5 = ar.reshape(5-1)
ValueError: cannot reshape array of size 12 into shape (5,newaxis)
 
cs

 

    ⑦ reshape(-1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# reshape(-1)
>>> ar = np.arange(12).reshape(34)
>>> ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar1 = ar.reshape(-1)
>>> ar1
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011])
 
>>> ar2 = ar.reshape(1-1)
>>> ar2
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011]])
 
>>> ar3 = ar.reshape(-11)
>>> ar3
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
 
cs

 

    ⑧ reshape() 기타

        - .reshape(-1, -1) : 행과 열에 명확한 기준값이 없으므로 에러가 발생한다.

        - .reshape(6, -2) : -1 보다 작은 값을 입력해도 동일한 의미를 갖는다.

 

반응형
반응형

1. 시험환경

    · python v3.7.2 (64 bit)

    · wxPython

 

2. 목적

    · pip를 이용하여 wxPython 라이브러리를 설치한다.

    · wxPython 윈도우/속성/메뉴 생성 등 기본 사용법을 알아보자.

 

3. 적용

    ①  pip를 이용하여 wxPython 라이브러리를 설치한다.

        - pip 업데이트를 진행한다: pip  -m  pip  install  -upgrade  pip

 

        - wxPython 라이브러리를 설치한다: pip  install  wxPython

 

        -  정상 설치 여부를 확인한다: python 프롬프트에서 import wx 실행

 

 

    ② wx.Frame을 이용한 Window 생성 예제

        - 파일명: 01_wxFrame_basic.py

1
2
3
4
5
6
7
8
9
import wx
 
app = wx.App()
 
frame = wx.Frame(None-1"Hello World!")
frame.Show()
 
app.MainLoop()
 
cs

 

        - 결과) “Hello World!”라는 title 갖는 window 생성

01_wxFrame_basic.py 실행화면

 

 

    ③ wx.Frame 속성을 적용한 Window 생성

        - 파일명: 02_wxFrame_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import wx
 
#    SetSize(width, height) : wx.Frame의 “가로 x 세로” 크기 설정
#    SetBackgroundColour(“color”) : wx.Frame 배경색 설정
#    CreateStatusBar() : 상태 표시줄 설정
#    Centre() : 화면 가운데 위치로 윈도우 이동
#    Move(wx.Point point) : 설정값 위치로 윈도우 이동
#    MoveXY(int x, int y) : 설정 좌표로 윈도우 이동
#    SetPosition(wx.Point point) : 윈도우의 위치 설정
#    SetDimensions(x, y, width, height, sizeFlags) : 윈도우의 위치와 크기 설정
 
class WxFrame_Setting(wx.Frame):
 
    def __init__(self, parent, title):
        super().__init__(parent, title = title)
        self.SetSize(600400)
        self.SetBackgroundColour("gray")
        self.CreateStatusBar()
        self.Centre()
        self.Show()
 
 
if __name__ == "__main__":
    app = wx.App()
    WxFrame_Setting(None, title = "wx.Frame Setting")
    app.MainLoop()
cs

 

 

        - 결과) 설정이 반영된 윈도우 화면

02_wxFrame_setting.py 실행화면

 

    ④ wx.Menu 속성을 이용한 메뉴 구성 예제

        - 파일명: 03_menu_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import wx
 
# wx.MenuBar : wx.Frame 상단에 위치한 메뉴를 구성하는 Bar
# wx.Menu : 메뉴에 기본적으로 나타나는 항목
# wx.MenuItem : wx.Menu 클릭시 나타나는 메뉴 항목
 
class wxMenu_setting(wx.Frame):
 
    def __init__(self, parent, title):
        super().__init__(parent, title = title)
        self.SetSize(600400)
        self.SetBackgroundColour("gray")
        self.CreateStatusBar()
        self.Centre()
 
        menu = wx.Menu()
        menu.Append(wx.ID_ABOUT, "About""description_1 in status bar")
        menu.AppendSeparator()
        Exit_ = menu.Append(wx.ID_EXIT, "Exit\tCtrl+E""description_2 in status bar")
        self.Bind(wx.EVT_MENU, self.evt_exit_click, Exit_)
 
        menuBar = wx.MenuBar()
        menuBar.Append(menu, "&File")
 
        self.SetMenuBar(menuBar)
        self.Show()
 
 
    # binding function
    def evt_exit_click(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_setting(None"wx.Menu setting")
    app.MainLoop()
 
cs

 

        - 결과) 설정 메뉴 확인 <Alt> 누르면 코드에서 지정한 단축키가 밑줄로 표시

 

 

    ⑤ Sub Menu 구성 예제

        - 파일명: 04_wxMenu_SubMenu_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import wx
 
# 동일한 서브메뉴를 구성하는 항목들은 동일한 ID로 설정해야 한다.
class wxMenu_SubMenu_setting(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
 
    def createWidget(self):
        menu = wx.Menu()
        menu.Append(wx.ID_NEW, "&New")
        menu.Append(wx.ID_OPEN, "&Open")
        menu.Append(wx.ID_SAVE, "&Save")
 
        menu.AppendSeparator()
 
        subMenu = wx.Menu()
        subMenu.Append(wx.ID_ANY, "Import File")
        subMenu.Append(wx.ID_ANY, "Import Image")
        subMenu.Append(wx.ID_ANY, "Export File")
 
        menu.Append(wx.ID_ANY, "Import/Export", subMenu)
 
        Exit_ = menu.Append(wx.ID_EXIT, "&Exit")
        self.Bind(wx.EVT_MENU, self.evt_exit_click, Exit_)
 
        menuBar = wx.MenuBar()
        menuBar.Append(menu, "&Menu1")
 
        self.SetMenuBar(menuBar)
 
        self.Show(True)
 
 
    def evt_exit_click(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_SubMenu_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) 메뉴 서브메뉴 구성 확인

04_wxMenu_SubMenu_setting.py 실행화면

 

    ⑥ Check Menu 구성 예제

        - 파일명: 05_wxMenu_Check_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import wx
 
#     menu item 생성시 wx.ITEM_CHECK 속성을 이용하여 check menu로 설정
class wxMenu_Check_setting(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
    def createWidget(self):
 
        menuBar = wx.MenuBar()
 
        # 1. File Menu
        m_file = wx.Menu()
        menuBar.Append(m_file, "&File")
 
        # 2. View Menu
        m_view = wx.Menu()
 
        # kind: Menu Type parameter
        # wx.ITEM_NORMAL(default), wx.ITEM_CHECK(check menu)
        self.show_tb = m_view.Append(wx.ID_ANY, "툴바 보기""툴바 ON/OFF", kind = wx.ITEM_CHECK)
        self.show_sb = m_view.Append(wx.ID_ANY, "상태바 보기""상태바 ON/OFF", kind = wx.ITEM_CHECK)
        
        # Default Set : ToolBar(Checked), StatusBar(Checked)
        m_view.Check(self.show_tb.GetId(), True)
        m_view.Check(self.show_sb.GetId(), True)
        
        # Binding event function
        self.Bind(wx.EVT_MENU, self.toolbar_click, self.show_tb)
        self.Bind(wx.EVT_MENU, self.statusbar_click, self.show_sb)
        
        menuBar.Append(m_view, "&View")
 
        self.SetMenuBar(menuBar)
 
        self.toolbar = self.CreateToolBar()
 
        self.statusBar = self.CreateStatusBar()
        self.statusBar.SetStatusText("Ready")
 
        self.Show(True)
 
 
    def toolbar_click(self, e):
        if self.show_tb.IsChecked():
            self.toolbar.Show()
        else:
            self.toolbar.Hide()
 
 
    def statusbar_click(self, e):
        if self.show_sb.IsChecked():
            self.statusBar.Show()
        else:
            self.statusBar.Hide()
 
 
if __name__ == "__main__":
    app = wx.App()
    wxMenu_Check_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) 체크 메뉴 선택에 따른 툴바 상태바 ON/OFF 기능

 

 

    ⑦ Pop-Up Menu 예제

        - 파일명: 07_wxMenu_PopUp_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import wx
 
#     MenuItem 클래스를 이용한 Pop-Up Menu 구성
class PopupMenu_setting(wx.Menu):
 
    def __init__(self, parent):
        super().__init__()
        self.parent = parent
 
        m_minimize = wx.MenuItem(self, wx.NewId(), "최소화")
        self.Append(m_minimize)
        self.Bind(wx.EVT_MENU, self.exec_minimize_func, m_minimize)
 
        m_exit = wx.MenuItem(self, wx.NewId(), "종료")
        self.Append(m_exit)
        self.Bind(wx.EVT_MENU, self.exec_exit_func, m_exit)
 
    def exec_minimize_func(self, e):
        self.parent.Iconize()
 
    def exec_exit_func(self, e):
        self.parent.Close()
 
        
class WinFrame(wx.Frame):
 
    def __init__(self*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.createWidget()
 
    def createWidget(self):
        # 1. Event : right click on mouse
        self.Bind(wx.EVT_RIGHT_DOWN, self.exec_right_down_func)
        self.Show(True)
 
    # Binding Function
    def exec_right_down_func(self, e):
        # 2. get the position(x, y) on the screen and show your definded popoup menu
        self.PopupMenu(PopupMenu_setting(self), e.GetPosition())
 
    def main():
        app = wx.App()
        WinFrame(None)
        app.MainLoop()
 
 
if __name__ == "__main__":
    WinFrame.main()
 
cs

 

        - 결과) 마우스 우클릭시 나타나는 팝업 메뉴 구성 기능 확인

07_wxMenu_PopUp_setting.py 실행화면

 

    ⑧ ToolBar Icon 구성 예제

        - 파일명: 08_Toolbar_Icon_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import wx
 
class Toolbar_Icon_setting(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
    def createWidget(self):
 
        # Create a ToolBar in wx.Frame
        # CreateToolBar()를 이용하여 생성된 ToolBar에 Icon 이미지 및 기능 추가
        tb = self.CreateToolBar()
 
        # Insert icon image into the ToolBar
        Exit_ = tb.AddTool(wx.ID_ANY, "Exit", wx.Bitmap("icon_image/icon_01.jpg"))
        self.Bind(wx.EVT_TOOL, self.exec_exit_func, Exit_)
 
        # essential code to show icon image for Win/Mac
        tb.Realize()
 
        self.Show(True)
 
    def exec_exit_func(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_Icon_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) ToolBar 추가된 Icon 이미지 기능 확인

08_Toolbar_Icon_setting.py 실행화면

 

    ⑨ Multiple ToolBar Icon 예제

        - 파일명: 09_Toolbar_Multiple_setting.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import wx
 
# 여러 개의 ToolBar를 사용하여 wx.Frame에 배치하는 경우, 겹쳐서 표현되는 문제를 해결해야 함
# wx.BoxSizer(wx.VERTICAL|wx.HORIZONTAL) : wx.Frame을 구획
# Add(ToolBar 객체, 구획비율, wx.EXPAND) : WindowFrame에 설정값으로 ToolBar 추가
class Toolbar_Multiple_setting(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
    def createWidget(self):
 
        # Use wx.ToolBar() instread of wx.CreateToolBar() to create Multiple ToolBar
        tb1 = wx.ToolBar(self)
        tb1.AddTool(wx.ID_ANY, "New", wx.Bitmap("icon_image/new.png"))
        tb1.AddTool(wx.ID_ANY, "Open", wx.Bitmap("icon_image/open.png"))
        tb1.AddTool(wx.ID_ANY, "Save", wx.Bitmap("icon_image/save.png"))
        tb1.Realize()
 
        # Use wx.ToolBar() instread of wx.CreateToolBar() to create Multiple ToolBar
        tb2 = wx.ToolBar(self)
        Exit_ = tb2.AddTool(wx.ID_ANY, "Exit", wx.Bitmap("icon_image/icon_01.jpg"))
        self.Bind(wx.EVT_TOOL, self.exec_exit_func, Exit_)
        tb2.Realize()
 
        # Set horizontal position of ToolBars in wx.Frame
        hBox = wx.BoxSizer(wx.HORIZONTAL)
        hBox.Add(tb1, 2, wx.EXPAND)
        hBox.Add(tb2, 1, wx.EXPAND)
        self.SetSizer(hBox)
 
        '''
        # Set vertical position of ToolBars in wx.Frame
        vBox = wx.BoxSizer(wx.VERTICAL)
        vBox.Add(tb1, 0, wx.EXPAND)
        vBox.Add(tb2, 0, wx.EXPAND)
        self.SetSizer(vBox)
        '''
        self.Show(True)
 
 
    def exec_exit_func(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_Multiple_setting(None)
    app.MainLoop()
 
cs

 

        - 결과) wx.HORIZONTAL/wx.VERTICAL 구획비율을 변경하며 테스트

09_Toolbar_Multiple_setting.py 실행화면

 

    ⑩ ToolBar의 아이콘(버튼) 활성/비활성 제어

        - 파일명: 10_Toolbar_icon_active_nonactive.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import wx
 
# EnableTool(“object ID”, True | False)
class Toolbar_icon_Act_NonAct(wx.Frame):
 
    def __init__(self*args, **kw):
        super().__init__(*args, **kw)
        self.createWidget()
 
 
    def createWidget(self):
        self.count = 5
 
        self.toolbar = self.CreateToolBar()
        toolbar_undo = self.toolbar.AddTool(wx.ID_UNDO, 'undo', wx.Bitmap('icon_image/undo.png'))
        toolbar_redo = self.toolbar.AddTool(wx.ID_REDO, 'redo', wx.Bitmap('icon_image/redo.png'))
 
        self.toolbar.AddSeparator()
 
        toolbar_exit = self.toolbar.AddTool(wx.ID_EXIT, 'exit', wx.Bitmap('icon_image/exit.png'))
 
        self.Bind(wx.EVT_TOOL, self.onUndo, toolbar_undo)
        self.Bind(wx.EVT_TOOL, self.onRedo, toolbar_redo)
        self.Bind(wx.EVT_TOOL, self.onExit, toolbar_exit)
 
        self.toolbar.Realize()
 
        self.Show(True)
 
 
    def onUndo(self, e):
        if self.count > 1 and self.count <= 5:
            self.count -= 1
        elif self.count == 1:
            self.toolbar.EnableTool(wx.ID_UNDO, False)
        elif self.count == 4:
            self.toolbar.EnableTool(wx.ID_REDO, True)
 
 
    def onRedo(self, e):
        if self.count >= 1 and self.count < 5:
            self.count += 1
        elif self.count == 5:
            self.toolbar.EnableTool(wx.ID_REDO, False)
        elif self.count == 2:
            self.toolbar.EnableTool(wx.ID_UNDO, True)
 
 
    def onExit(self, e):
        self.Close()
 
 
if __name__ == "__main__":
    app = wx.App()
    app.locale = wx.Locale(wx.LANGUAGE_ENGLISH)
    Toolbar_icon_Act_NonAct(None)
    app.MainLoop()
 
cs

 

        - 결과) ToolBar 버튼 활성화/비활성화

 

4. 결과

    · 소스코드 파일첨부

Python_GUI_wxPython.zip
0.02MB

 

 

반응형
반응형

1. 시험환경

    ˙ 윈도우

    ˙ python, venv, pip

 

2. 목적

    ˙ 프로젝트 별 패키지 버전을 관리 하기 위해 파이썬 가상화 환경에서 개발한다.

    ˙ venv 관련 명령어 및 패키지 관리법에 대하여 알아보자.

 

3. 적용

    ① 파이썬이 설치되어 있어야 한다.

        - 참고 : https://languagestory.tistory.com/31

 

Window 파이썬(python) 설치하기

1. 시험환경 ˙ 윈도우 ˙ 파이썬 2. 목적 ˙ 윈도우 운영체제에서 파이썬을 설치한다. 3. 적용 ① 파이썬 공식 사이트에 접속하여 "Downloads" 메뉴를 클릭한다. - https://www.python.org/ ② 설치 프로그램이

languagestory.tistory.com

 

    ② 생성 : 가상환경을 생성하면 "가상환경-이름"으로 하위폴더가 생성된다.

        - python -m venv [가상환경-이름]

        - 보통, [가상환경-이름].venv로 지정하는 것이 관례이다.

 

    ③ 활성화 : 커맨드라인 맨 왼쪽에 (가상환경-이름)이 붙는 것을 확인하면 활성화 모드로 진입한다.

        - [가상환경-이름]/Scripts/activate.bat

 

    ④ 활성화 모드에서 "deactivate" 명령어를 입력하면 비활성화 된다.

 

    ⑤ 가상환경 내에서 패키지 설치/삭제

        - 가상환경 활성화 상태에서 "pip install" 명령어로 패키지 설치
        - 가상환경 활성화 상태에서 "pip uninstall" 명령어로 패키지 삭제

        - 가상환경 생성 폴더 내에서 작업한 것에 유의한다.

 

    ⑥ 설치 패키지를 확인하고 다른 환경에서도 동일한 패키지를 일괄 설치할 경우의 명령어를 실행한다.

        - pip freeze
        - pip freeze > requirements.txt
        - pip install -r requirements.txt

가상환경에서 설치한 패키지만 포함

 

     가상환경 및 관련 패키지 삭제

        - 폴더를 삭제한다 :  [가상환경-이름] 폴더

 

반응형
반응형

1. 시험환경

    ˙ python

    ˙ pandas

 

2. 목적

    ˙ excel 파일을 읽어서(load) dataframe을 생성한다.

    ˙ dataframe을 excel 파일로 저장한다.

 

3. 적용

    ① 파이썬을 이용하여 읽어 올 엑셀(excel) 파일을 준비한다.

read.xlsx
0.01MB

 

    ② 엑셀(excel) 파일을 읽어서 데이터를 추가한 후 엑셀(excel) 파일로 저장하는 파이썬 예제 코드이다.

        - 첫번째 행에 'idx' 컬럼 생성 후 index 값을 추가한다.

        - 마지막 행에 'extra' 컬럼 생성 후 모든 행에 'appended_column'을 추가한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
 
if __name__ == '__main__':
 
    # 데이터프레임 생성 (load from excel)
    data_frame = pd.read_excel('./RawData/read.xlsx', engine='openpyxl', sheet_name='Sheet1')
 
    row_list = []
 
    for index, row in data_frame.iterrows():
        row_list.append([index, row['Language'], row['Money'], row['Nation'], row['Population'], 'appended_column'])
 
    print(row_list)
 
    # 데이터프레임 생성 (save to excel)
    df = pd.DataFrame(row_list, columns=['idx''Language''Money''Nation''Population''extra'])
 
    # Excel 파일로 저장
    df.to_excel('./RawData/write.xlsx', index=False, sheet_name='Sheet2')
 
cs

 

4. 결과

    ˙ 프로그램 실행 콘솔로그

 

    ˙ 프로그램 실행 후 생성된 엑셀 파일 (추가된 컬럼)

 

반응형

+ Recent posts