본문 바로가기

프로그래밍/Python

파이썬 GUI

전체코딩
# import tkinter
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
from tkinter.simpledialog import *


## 함수
def btnClick():
    messagebox.showinfo("제목", '요기가 내용~~~~')


def openFile():
    global image, ROW, COL, filename
    filename = askopenfilename(parent=window,
                               filetypes=(("RAW 파일", "*.raw"), ("모든파일", "*.*")))
    # 1-1 메모리 할당
    image = [[0 for _ in range(COL)] for _ in range(ROW)]
    # 1-2. 불러오기 (대신 랜덤)
    rfp = open(filename, 'rb')
    for i in range(ROW):
        for k in range(COL):
            image[i][k] = ord(rfp.read(1))
    rfp.close()
    printImage()


def printImage():
    global image, ROW, COL, filename
    for i in range(ROW):
        for k in range(COL):
            r = g = b = image[i][k]
            paper.put("#%02x%02x%02x" % (r, g, b), (k, i))


def copyData():
    value = askinteger("제목", "설명~~~~", minvalue=0, maxvalue=255)
    label1.configure(text=str(value))


## 변수
filename = ""
window, canvas, paper = None, None, None
ROW, COL = 256, 256
image = []
## 메인
window = Tk()  # 벽
window.title("요기 제목")
window.geometry('300x400')

## 캔버스 + 페이퍼
canvas = Canvas(window, height=256, width=256)
paper = PhotoImage(width=256, height=256)
canvas.create_image((256 / 2, 256 / 2), image=paper, state='normal')

## 메뉴
mainMenu = Menu(window)  # 메뉴의 틀
window.config(menu=mainMenu)

fileMenu = Menu(mainMenu)  # 상위 메뉴(파일)
mainMenu.add_cascade(label='파일', menu=fileMenu)
fileMenu.add_command(label='열기', command=openFile)
fileMenu.add_command(label='저장')
fileMenu.add_separator()
fileMenu.add_command(label='종료')

editMenu = Menu(mainMenu)  # 상위 메뉴(편집)
mainMenu.add_cascade(label='편집', menu=editMenu)
editMenu.add_command(label='복사', command=copyData)
editMenu.add_command(label='잘라내기')
editMenu.add_separator()
editMenu.add_command(label='붙여넣기')

# 위젯 == 컨트롤
label1 = Label(window, text="나는 글자다", font=("궁서체", 20))
button1 = Button(window, text="This is Button", fg='red', bg='yellow',
                 font=("Lucida Fax", 20), command=btnClick)

label1.pack(side=TOP)
button1.pack(side=TOP)
canvas.pack()
# label1.place(x=100, y=30)
# button1.place(x=50, y=230)
window.mainloop()

라이브러리
# import tkinter
from tkinter import *
from tkinter import messagebox
from tkinter.filedialog import *
from tkinter.simpledialog import *

- 파이썬으로 윈도우 창을 띄우기 위해 사용


함수부분_btnClick()
def btnClick():
    messagebox.showinfo("제목", '요기가 내용~~~~')

- 메세지 박스를 띄움

  제목 :  상단바

  요기가 내용 : 가운데 메세지

함수부분_openFile()
def openFile():
    global image, ROW, COL, filename
    filename = askopenfilename(parent=window,
                               filetypes=(("RAW 파일", "*.raw"), ("모든파일", "*.*")))

- global : 파이썬은 전역변수가  때문에 global을 이용해 전역변수로 선언해줌

- askopenfilename을 사용하면 다음과 같은 화면이 뜸

- filtypes는 파일 종류를 설정 가능

 

     image = [[0 for _ in range(COL)] for _ in range(ROW)]

- ROW x COL 값만큼의 image배열 준비, 초기값 0

 

    rfp = open(filename, 'rb')
    for i in range(ROW):
        for k in range(COL):
            image[i][k] = ord(rfp.read(1))
    rfp.close()
    printImage()

- 파일을 불러온 뒤 ROW x COL 배열에 대입

- rfp파일 닫음

- printImage 함수로 출력

 

함수부분_printImage()
def printImage():
    global image, ROW, COL, filename
    for i in range(ROW):
        for k in range(COL):
            r = g = b = image[i][k]
            paper.put("#%02x%02x%02x" % (r, g, b), (k, i))

- global : 파이썬은 전역변수가  때문에 global을 이용해 전역변수로 선언해줌

 

- 그레이 스케일을 불러올거기 때문에 r = g = b 를 (i , k)에 넣음

- 화면에 출력

 

함수부분_copyData()
def copyData():
    value = askinteger("제목", "설명~~~~", minvalue=0, maxvalue=255)
    label1.configure(text=str(value))

- askinteger를 사용하면 값을 대입하는 입력창이 뜸

- 최댓값 최솟값 설정가능

- 입력한 값은 문자로 변환되어 label1에 입력됨


전역변수
filename = ""
window, canvas, paper = None, None, None
ROW, COL = 256, 256
image = []

메인함수_윈도우창 설정
window = Tk()  # 벽
window.title("요기 제목")
window.geometry('300x400')

- title은 맨위 바

- geometry는 윈도우창의 크기

 

메인함수_윈도우창 화면 안쪽
canvas = Canvas(window, height=256, width=256)
paper = PhotoImage(width=256, height=256)
canvas.create_image((256 / 2, 256 / 2), image=paper, state='normal')

- 윈도우창 안쪽 canvas의 크기 설정

- 이미지가 나타날 paper 크기 설정

- create_image로 이미지 생성

  - paper 중심을 기준으로 paper가 나타날 곳을 (x , y)로 표시

 

메인함수_메뉴 생성
mainMenu = Menu(window)  # 메뉴의 틀
window.config(menu=mainMenu)

- 윈도우창 menu, Menu(master)

- config는 바아래 부분, menu는 mainMenu로 받음

 

fileMenu = Menu(mainMenu)  # 상위 메뉴(파일)
mainMenu.add_cascade(label='파일', menu=fileMenu)
fileMenu.add_command(label='열기', command=openFile)
fileMenu.add_command(label='저장')
fileMenu.add_separator()
fileMenu.add_command(label='종료')

editMenu = Menu(mainMenu)  # 상위 메뉴(편집)
mainMenu.add_cascade(label='편집', menu=editMenu)
editMenu.add_command(label='복사', command=copyData)
editMenu.add_command(label='잘라내기')
editMenu.add_separator()
editMenu.add_command(label='붙여넣기')

- add_cascade는 메뉴에 점선으로 표시됨

- separator은 실선으로 표시됨

- command는 label 이름으로 표시됨

- 메뉴중 하나를 클릭시 거기에 해당하는 함수가 작동함

 

메인함수_위젯 컨트롤
label1 = Label(window, text="나는 글자다", font=("궁서체", 20))
button1 = Button(window, text="This is Button", fg='red', bg='yellow',
                 font=("Lucida Fax", 20), command=btnClick)

label1.pack(side=TOP)
button1.pack(side=TOP)
canvas.pack()
# label1.place(x=100, y=30)
# button1.place(x=50, y=230)
window.mainloop()

- Label은 글자를 생성함

- Button은 버튼을 생성함, command로 눌렀을 때 동작될 함수를 지정

- .pack()은 위치를 조절함, (side=TOP)은 위치를 맨 위로 지정

- window.mainloop()로 루프를 만들어 window 창안에서 계속해서 동작하도록 함

'프로그래밍 > Python' 카테고리의 다른 글

Gray Scale 영상처리 : 반전 이미지  (0) 2022.02.18
Gray Scale 영상처리 : 이미지 불러오기  (0) 2022.02.18
바이너리 파일처리  (0) 2022.02.17
파일 처리  (0) 2022.02.17
임의의 이미지값 출력  (0) 2022.02.17