이번에 수정한 부분은 위와 같다.

chart 클래스가 버튼을 생성하고, 그 버튼의 값을 entry에 보여줘야 하므로

chart클래스가 entry타입을 받게끔 하였다.

그리고 버튼을 클릭하면 값이 보이게 하는 메서드를 밖으로 빼서 만들었다.

문제는 문장을 보여줘야하므로 바뀌는 값이 계속 저장되게끔 해야하는데 이 구성을 어떻게 매끄럽게 할지가 가장 큰 고민이다.


from tkinter import *;
from chart import *;
from display import *;

window = Tk();
window.title("Maplotlib Calc");
window.geometry("500x400");
# 결과들을 보여주는 아웃풋
output = display(window, 0, 0);
out_entry = output.make_Entry(0,0,70,"light green")
# class를 생성할시엔 무조건 frame row, col을 받게끔 해야함
chart = chart(window,2,0,out_entry); # 버튼을 만들기 위함
chart.make_button();
window.mainloop();

from tkinter import *;
class chart:
    def __init__(self, window, row, column, output_entry):
        self.window = window;
        self.pad = Frame(window);
        self.row = row;
        self.column = column;
        self.outentry= output_entry;
        self.pad.grid(row = self.row, column = self.column,sticky = W);

    def make_button(self):
        char_lst = ['LINE', 'SCATTER']
        r , c = 0,0
        for k, v in enumerate(char_lst):
            def inner(index = k):
                self.show(index)
            Button(self.pad, text = v, width =10, command = inner).grid(row = r, column = c)
            c +=1;

    def show(self, index): # 버튼만 보여주는 메서드
        button_pad = Frame(self.window)
        button_pad.grid(row =3, column =0, sticky = N);
        if index == 0:
            cr = {'black' : 'k', 'green':'g', 'red':'r'};
            ls = {'solid' : '-', 'dashed' : '--', 'dashed dot' : '-.'};
            marker = {'point' : '.', 'circle' : 'o', 'triangle_up' : '^'};
            category = [cr, ls, marker];
            r = 0;
            c = 0;
            record_lst = [];
            for i in range(len(category)):
                for key,value in category[i].items():
                    def inner(k = key, v = value, index =i):
                        print(i)
                        del record_lst[i:i+1];
                        record_lst.insert(i,{k,v});
                        self.button_action(k,record_lst);
                    Button(button_pad,text = i, width = 10, command = inner).grid(row = r, column=c);
                    c += 1;
                if c > 2:
                    c = 0;
                    r += 1;

    def button_action(self,key,lst):
        #str = "plt.plot([10, 20, 30, 40], [1, 4, 9, 16], c= '%s', ls='%s', marker='%s')" %(lst[0][key],lst[1][key], lst[2][key]);
        print(lst);
        self.outentry.delete(0, END);
        self.outentry.insert(END, "Test");


기존에 진행중이던 것들이 어느정도 끝났기에 얼른 이것을 마무리 하려한다.

지난번에는 main 클래스에 모든것을 다 넣고서 돌아가게끔 하는게 목적이었고 이번엔 지난번 것을 바탕으로

나름 클래스화 하여 구성해보려 한다.


메인 화면은 크게

1. 내가 선택한 파라미터 명령어가 나오게 하는 것

2. 차트 종류를 선택하면 그에 해당하는 파라미터가 등장

3. 파라미터 버튼 클릭시 1번 화면 업데이트

4. 생성 버튼 클릭시 matplot 화면을 보여줌

5. 파라미터 클릭시 실시간 변화...


이렇게 5개의 기능이 목표이다.



from tkinter import *;
from chart import *;
from display import *;

window = Tk();
window.title("Maplotlib Calc");
window.geometry("400x300");
# 결과들을 보여주는 아웃풋
output = display(window, 0, 0);
output.make_Entry(0,0,70,"light green")
# class를 생성할시엔 무조건 frame row, col을 받게끔 해야함
chart = chart(window,2,0); # 버튼을 만들기 위함
chart.make_button();
window.mainloop();

기본적으로 tkinter를 이용해 gui를 구성, 현재 위 메인단에서 클래스는 하나는 버튼용, 하나는 out풋 용으로 만들었다


from tkinter import *;
class display():
    def __init__(self, window, row,col):
        self.window = window;
        self.row = row;
        self.col = col;
        self.tpfr = Frame(window);
        self.tpfr.grid(row = self.row, column = self.col, sticky = N);

    def make_Entry(self, row, col, width, color):
        display = Entry(self.tpfr, width = width, bg=color)
        display.grid(row = row, column = col);

단순히 엔트리(녹색 입력창?) 을 만들기 위한 클래스, 모든 클래스는 frame 생성을 위해 row, col을 받게끔 설정


from tkinter import *;
class chart:
    def __init__(self, window, row, column):
        self.window = window;
        self.pad = Frame(window);
        self.row = row;
        self.column = column;
        self.pad.grid(row = self.row, column = self.column,sticky = W);

    def make_button(self):
        char_lst = ['LINE', 'SCATTER']
        r , c = 0,0
        for k, v in enumerate(char_lst):
            def inner(index = k):
                self.show(index)
            Button(self.pad, text = v, width =10, command = inner).grid(row = r, column = c)
            c +=1;

    def show(self, index):
        button_pad = Frame(self.window)
        button_pad.grid(row =3, column =0, sticky = N);
        print("show show", index)
        if index == 0:
            cr = {'black' : 'k', 'green':'g', 'red':'r'};
            ls = {'solid' : '-', 'dashed' : '--', 'dashed dot' : '-.'};
            marker = {'point' : '.', 'circle' : 'o', 'triangle_up' : '^'};
            category = [cr, ls, marker];
            r = 0;
            c = 0;
            for i in range(len(category)):
                for key,value in category[i].items():
                    Button(button_pad,text = key, width = 10).grid(row = r, column=c);
                    c += 1;
                if c > 2:
                    c = 0;
                    r += 1;

문제의 버튼 클래스, 처음에 차트 종류를 보여주고, 클릭하면 파라미터가 보여질수있게끔 코드를 짜다보디 이런모양이 되었다..

지금은 아주 단순하지만 나중에 모든 것을 다 넣는다고 할 경우


1. 차트의 종류 설정

2. 해당 차트에 맞는 파라미터 버튼 생성

3. 버튼 클릭

4. 조건에 맞는 차트 그래프 보여주기.


크게 4가지로 나누고 이걸 다시 나누면.. 흠


1) 차트 종류를 입력받는 클래스

2) 1 정보를 받아서 버튼 생성 + 버튼 기능 

3) 2) 정보를 받아서 그래프 보여주기.


이렇게 클래스 짜면 되지않을까 싶음.

기본적인 기능은 대략적으로 구현되었다..


1. 색, 모양 등을 선택하면 해당되는 파라미터를 디스플레이에 띄워준다.

2. 선택한 파라미터에 맡게 matplolib를 보여주자.


애초에 이 스몰 프로젝트를 진행하게 된 이유는 수많은 파라미터 때문에 matplotlib을 고생하는 사람들을 위해

만든 것이고 그렇기에 간단하고 직관적이게 보여주고자 하는것이 목적이었다.


기능 구현이 우선이기에 일단 파라미터는 3개만을 기록하여 구동되도록 하였다.

다만 문제가 무진장 많다..


일단 이를 이전에 계산기나 핑퐁게임처럼 클래스 화를 하려니 어떠한 기준으로 이것을 나눠야하는지가 제일 큰 고민이고

두번째로는 이걸 만들다보니 실시간으로 그래프 모양이 바뀌었으면 좋겠다 라는 생각이 든다.

세번째로는 수많은 파라미터를 어떻게 조절해야하며

네번째로는 바 차트 뿐만 아니라 다양한 다른 차트들은 어떻게 적용하고

마지막으로 저 숨막히는 GUI를 어떻게 손대야할지...


어렵다 ㅠ_ㅠ

따로 클래스 정리를 안하고

일단 있는 그대로 다 작성하였다.


여러가지 의문이 많이 발생하였고 이제 풀어나가야한다.

제일 성급한 문제는 지정한 각종 파라미터를 어떻게 저장하고 유지하여 넘겨주는가 이다...



사이즈도 문제이고.. 허허 쉽지않다

지난번 예제를 바탕으로 

맨처음 했었던 계산기를 모듈화 해보기로.


말이 모듈화지 결국 클래스로 쪼개는 것인데

이를 나눌때 어떻게 잘 나눠야 하는지 제일 큰 주제였다.


계산기가 구동된다고 하면

기능을 구동시키는 메인,

배경을 담당하는 테이블,

버튼을 담당하는 버튼,


이렇게 크게 3가지로 나누어 지고 여기서 버튼의 클릭 기능을 어떻게 붙여야 할지가 핵심 관건이었다.

(사실상 돌아가게 구현하려면 버튼 클래스에 넣는게 제일 좋다)


다만 버튼이 만들어지는 객체마다 클릭 기능이 살짝 다르므로

(예를 들어 숫자는 단순 숫자 입력이지만 +,- 등은 다르기 때문)

이를 단순히 버튼안에 넣고 돌리는 것 역시 좋은 방법은 아니다.


자바처럼 get, set이 없으니 클래스 변수 사용하는 것도 어색하고.. 확실히 다른 느낌이다.

구체 클래스를 작성하겠다.



이미지로 보는게 좋아서 이미지 파일과 같이..

(잘 안보여서 pdf도 같이 첨부)

파이썬 앱.pdf





코딩 클럽 레벨 3을 보고 코드 작성 후 리뷰하는 글 입니다.


http://www.codingclub.co.uk/

여기 사이트서 소스를 받으실 수 있습니다.


벽돌 부시기 게임은 크게 4가지로 구분할 수 있습니다.



1. 메인

2. 테이블

3. 공

4. 막대기



위에 그림처럼 게임이 구동 되는 것이 목표


검정석 배경에 대쉬가 그려져 있는 것이 테이블이며

그 위에 노랑, 파랑색 막대기와 빨강색 공이 테이블위에서 움직인다


책을 더 잘 이해하기 위해선 클래스 개념과 함수(좌표)를 잘 이해해야한다..


# 배경이 되는 테이블



테이블은 생성자, 도형만들기, 구체 만들기, 아이템 옮기기 등의 주요 메서드가 있다.


1) 생성자

생성자는 메인으로부터 window, 즉 tkinter를 받는다. 

Canvas라는 메서드는 window의 백그라운드를 설정해준다.

pack()으로 고정을 해줘야 한다.


vertical, horizontal의 경우 가로선, 세로선을 결정하기 위해 필요한 파라미터 이다.

create_line의 경우 캔버스의 라인을 그려준다.

특이한 점은 얘는 좌표를 4개를 받는다.(x1, x2, y1, y2)

* 좌표를 4개 받는 경우는 앞으로 계속 나옴.


2) 도형만들기

draw_rectanlgle의 경우 실제 불리는 건 bat 클래스에서 불려진다.

안에 파라미터인 retangle의 경우 bat 클래스에서 보면 결국 자기 자신이 들어간다.

즉 bat 클래스 호출(bat 크기 지정) -> draw_rectangle 호출(bat의 크기 호출) : 이런식으로 진행이 된다.

create_rectanlge의 경우 좌표 4개를 받아서 그 상태로 도형을 만든다

사각형에서 대각선 점 2개의 x,y 좌표를 바탕으로 위 아래, 양 옆으로 선을 그어서 도형을 만든다고 생각하면 된다.

* 이 개념이 계속 나오므로 잘 이해를 해야함..


3) 구형만들기

draw_oval의 경우 위에와 동일하다. 얘는 ball 클래스에서 불려지며 결국 ball 클래스에서 지정된

사이즈를 전부 적용하여 구체를 만들게된다.



기타) 다른 메서드의 경우 좌표를 바탕으로 움직이게 하는 메서드이다.


특이한 점은 ball, bat 클래스 모두 table를 받아서 table의 메서드를 통해서 도형과 구체를 만든다는 점이다.

이 말은 다르게 표현하자면 ball, bat의 생성자에는 무조건 table를 받아야 한다는 의미가 된다.


맨 처음 파이썬을 접한 것도, 이쪽의 길을 가게 된 것도 결국은 데이터 분석, 데이터를 위함이었다.

그렇기에 당시에 내가 파이썬을 접하고, 사용했던 목적은 무언가를 계산하기 위함, 그 이상도 이하도 아니었다.

그랬기에 파이썬은 당시의 나, 그리고 지금까지도 입력-실행-결과 라는 단순한 프로세스로 이해하였다.


그렇기에 이번기회에는 이러한 단순 프로세스를 탈피하여 하나의 프로그램을 만들고자 한다.

물론 이는 책을 바탕으로 따라하는 것이지만 이를 기본으로 하여 내가 생각하는 무언가를 만들예정이다!!


코딩클럽은 중학생? 을 대상으로 한 책이라 매우 쉽게 읽을수 있는데 내용은 그렇게 쉽지않다.

물론 쉽게 설명되어있다..


레벨 2에서는 계산기를 만든다... 계산기...

따로 코드를 적기 보다는 기본적인 내용을 정리하는 식으로 올릴 예정이다.



GUI는 기본 내장 라이브러리 인 Tkinter를 사용한다.

from Tkinter import *;


간략히 구동되는 것을 설명하자면

Tkinter 라이브러리를 통해 윈도우(창? 혹은 창 내의 앱?)을 킨다. 그리고 x(종료) 하기 전까지 계속 켜져 있는다.

그리고 이 윈도우 창 내에 여러가지를 위치 시켜서 무언가를 만든다.


그렇기에 일단 윈도우를 불러내야 하므로 Tkinter로부터 가져온다


window = Tk();

window.title("My First Title") # 윈도우 창의 타이틀이다.. 큰 의미 없다..


window.mainloop(); # 작성된 윈도우를 돌린다.. 종료 전까지


이제 저 중간에 내가 넣고자 하는 애들을 삽입 시켜서 작동시키면 된다!!


중간에 작성할 애들은 크게 Label, Entry, Button 등이 있다(물론 더 있을거다.. 아마 )


Label : 레이블은 윈도우에 텍스트를 표시할때 주로 사용한다, 백그라운드의 의미? 로 이해하였다.

Entry : 엔트리는 텍스를 입력할 수 있는 상자를 제공한다. input을 받는 애이다.

Button은 말그대로 버튼이다. 버튼 모양을 만들며 액션을 추가 할 수도 있다.


1. Label 생성하기

Label(window, text = "원하는 말").grid(row = 0, column =0 , sticky = N)

# 레이블 생성시 당연히 이 레이블이 윈도우에 올라가므로 위에서 생성한 윈도우 객체를 파라미터로 넣어준다


# 그리고 레이블이 생성될때 위치로 잡아줘야하므로 이를 grid로 하여 row, column으로 위치를 잡는다.


2. Entry 생성하기

Entry(window, width = 20, bg = "light blue")

# 이 친구 역시 윈도우에 생성 되므로 위에서 생성한 객체를 파라미터로 넣어준다

# 엔트리위치를 잡기에 앞서서 이 박스 크기, 색을 지정해줘야 하므로 width, bg로 설정해준다

# 그리고 동일하게 grid를 통해서 전체 위치를 설정한다.


3. Button 생성하기

Button(window, text ="버튼 위에 말", width = 5, command =click).grid(row=2, column = 0, stick = W)

# 윈도우를 파라미터로 받았다.

# 사이즈도 지정해주었다.

# 버튼의 핵심은 command이다. click는 저 위에 어딘가에서 설정된 함수이고 버튼을 클릭하면 click함수가 작동된다

# 함수 내에서 파라미터를 설정하여 값들을 변화시켜줄 수 있다.


https://github.com/homekeeper89/python-calc

자세한 코드는 위에 올려져 있다..



아래는 원본





+ Recent posts