본문 바로가기
Python/tkinter

[Python tkinter] tkinter 모듈을 이용한 GUI - Tk() 위젯과 Label() 위젯Botton() 위젯으로 윈도우창 만들기

by dev수니 2021. 4. 7.
반응형

 

 

 1  tkinter

 

 

tkinter 는 파이썬 내장 모듈로 단순위젯(Lightweight GUI) 지원 모듈이다. 따라서 사용시 모듈을 import 후 사용해준다.

윈도우 창을 만들고 Button, Canvas, CheckBox 등을 추가해 줄 수 있다.

 

그리고 위젯들은 모두 클래스로 이루어져 있기 때문에 원하는 객체를 생성해서 사용해 줄 수 있다.

 

 

먼저 윈도우 창을 만들어보자. 윈도우 창은 Tk() 로 만들어 줄 수 있다. 

 

 

 

 

 2  Tk() 위젯으로 윈도우 창 생성

 

1
2
3
4
5
6
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
 
win.mainloop()    # 맨 아래 작성
cs

 

단순 import만 사용하게 되면 함수를 사용할 때 마다 모듈명을 붙여줘야 하기에 from tkinter import * 로 사용해줬다.

그리고 Tk()를 win 객체에 담아 윈도우 창을 생성해주었다.

 

윈도우 창을 생성해줬으면 마지막에 mainloop()를 작성해줘야 한다. mainloop()는 다양한 이벤트로부터 오는 설정을 전달하는 역할을 한다. 윈도우 창을 닫을 때 까지 윈도우를 실행시켜주는 메서드로 꼭 작성해주는 습관을 들이도록하자.

 

 

실행시키면 다음과 같이 윈도우 창이 생성된다.

 

 

윈도우 창을 만들어 줬으니 창크기와 생성 위치를 설정해주는 메서드도 알아보자. 창크기와 생성위치geometry()를 통해 설정해줄 수 있다. 다음과 같이 사용하면 된다.

 

geometry("너비x높이+x좌표+y좌표")

 

 

위 코드에 geometry() 추가 후 실행시켜주면 다음과 같이 창의 크기가 설정된다.

 

1
2
3
4
5
6
7
8
9
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
win.geometry("300x300+100+100")
# 너비가 300 높이가 300 인 윈도우 창을
# 화면 왼쪽상단을 기준, x축 100 y축 100만큼 떨어진 곳에 생성 
 
win.mainloop()    # 맨 아래 작성
cs

 

 

그리고 창의 모서리에 마우스 커서를 올려서 창의 크기를 조절할 수도 있는데 이를 방지할 수 있는 메서드도 있다.

resizable() 메서드인데 이 값은 기본적으로 True로 적용되어있다. 이를 False로 바꿔주면 크기조절이 불가능하다.

 

 

resizwable(x축방향,y축방향)
# 각 값으로 True/False가 들어갈 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
win.geometry("300x300+100+100")
# 너비가 300 높이가 300 
# 화면 왼쪽상단을 기준, x축 100 y축 100만큼 떨어진 곳에 생성 
win.resizable(True,False)
# x축방향으로는 조절이 가능하고 y으로는 불가능하다.
 
win.mainloop()    # 맨 아래 작성
cs

 

그리고 윈도우 창의 타이틀도 설정해줄 수 있다. title()메서드를 사용한다. 아래와 같이 코드 작성 후 실행시켜주면 다음과 같이 타이틀이 설정된다.

 

1
2
3
4
5
6
7
8
9
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
win.geometry("300x300+100+100")
win.resizable(True,False)
win.title("제목없는 윈도우"# 윈도우 타이틀 설정
 
win.mainloop()    # 맨 아래 작성
cs

 

 

 

 

 2  Label() 위젯

 

 

 

그럼 윈도우 창안에 글씨를 적어보자. Label 을 사용해 적어줄 수 있는데 이것은 클래스 형태로 존재한다. Label에는 설정해줄 수 있는 여러가지 설정값들이 존재한다.

 

 

라벨 형태 설정

 

 

따라서 위의 형태를 이용해 Label()을 사용해보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
win.geometry("300x300+100+100")
win.resizable(True,False)
win.title("제목없는 윈도우"# 윈도우 타이틀 설정
 
# 윈도우 창안에 뭔가 적어주는 메서드
label1 = Label(win,text="파이썬18", bg='red',fg='white')  # 색상설정
label2 = Label(win,text="박스1", bg='green',fg='black')  # 색상설정
 
label1.pack() # 화면배치 관리자 label의 위치를 지정줌. pack을 해주지 않으면 label이 뜨지 않음.
label2.pack()
 
 
win.mainloop()    # 맨 아래 작성
cs

 

위와 같이 Label은 객체(클래스)이기 때문에 label1이라고 하는 변수에 담아준다. 그리고 Label() 객체 안에 먼저 데이터를 넣어줄 객체(win)를 알려주고, text="" 형식으로 들어갈 내용을 작성해준다. 그리고 bg=""을 이용해 배경색을 설정, fg=""를 이용해 폰트 색상을 설정해주었다. 

 

그리고 줄 13,14에 pack()은 화면 배치 관리자로 label을 화면에 배치해줄 수 있는데 pack을 해주지 않으면 윈도우 창에 label이 뜨지 않는다. 

 

위 내용을 실행시키면 다음과 같다. 기본적으로 위치를 지정해주지 않으면 상단 가운데에 위치하게 된다.

 

 

글씨를 써줬으니 버튼을 넣어줄 수도 있을 것이다. 다음으로 버튼을 넣는 방법을 알아보자.

 

 

 2  Button() 위젯 

 

 

버튼을 넣어줄 수 있는 Button위젯은 Label과 마찬가지로 클래스 형태이다. 따라서 객체 안에 넣어서 사용해줘야 한다.

다음과 같이 사용해줄 수 있다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
win.geometry("300x300+100+100")
btn1 = Button(win,text='첫번째버튼')    # 버튼 생성
btn2 = Button(win,text='두번째버튼')    # 버튼 생성
 
btn1.pack()    # 화면배치
btn2.pack(side=RIGHT) # 화면배치
 
win.mainloop()    # 맨 아래 작성
cs

 

 

Button()도 마찬가지로 안에 버튼을 넣어줄 객체를 알려주고, text=""로 내용을 적는다. 그리고 pack을 이용해 화면에 배치시켜준다. 똑같이 기본값은 상단 가운데이지만 위치를 지정해줄 수 있다.

btn1은 기본값, btn2는 RIGHT로 지정해 주었다.

 

pack() 은 윈도우 자체 크기로 압축해서 자동 지정한다. 특별한 지정 없으면 top에 지정되고 side = LEFT, RIGHT, TOP, BOTTOM 으로 위치 지정이 가능하다.

 

pack(side=LEFT, RIGHT, TOP, BOTTOM)

 

 

 

 

 

그리고 좌표의 위치값을 지정해 위젯을 표시하는 place() 도 있다. 이것은 안에 값으로 x좌표y좌표의 값을 넣어서 설정한다. 왼쪽 상단으로 부터 가로 x, 세로y 만큼떨어진 곳에 위치하게 된다.

 

place(x=값1,y=값2)

 

1
2
3
4
5
6
7
8
9
10
11
12
from tkinter import *
 
win = Tk()     # 윈도우창을 생성
 
win.geometry("300x300+100+100")
btn1 = Button(win,text='첫번째버튼')    # 버튼 생성
btn2 = Button(win,text='두번째버튼')    # 버튼 생성
 
btn1.place(x=0,y=0)
btn2.place(x=50,y=100)
 
win.mainloop()    # 맨 아래 작성
cs

 

 

 

반응형

댓글