본문 바로가기
Python/Python tkinter

[Python tkinter] 5. Button 위젯 생성 및 클릭 시 동작 지정하기

by Rosmary 2022. 1. 23.
728x90
반응형

 

 

 

GUI 프로그램을 만들다보면, Button은 반드시 하나 이상 들어가기 마련이다. 당장 문서 열기 메뉴를 클릭하면 나오는 창 역시, "열기" 버튼과 "취소 버튼이 존재하고 있다.

 

 

GUI 프로그래밍에서 그만큼 자주 쓰이는 위젯이고 클릭 시의 동작도 바로바로 확인할 수 있기 때문에, tkinter로 위젯을 배울 때 보통 Button의 생성/배치부터 접하게 되는 경우가 많다. 물론 필자는 Frame이 더 중요하다고 생각해서 Button 관련 포스팅을 지금에야 하게 되었지만 말이다.

 

본격적으로 Button 위젯의 생성과 설정, 배치에 대해 알아보자.

 

 

1. Button() 클래스

 

Button 위젯 생성을 위한 클래스 호출은 아래와 같이 진행하면 된다.

 

Button 객체변수명 = tkinter.Button(master=위젯을 배치할 창 객체명, text="버튼에 들어갈 문구 입력")

 

호출 시 사용하는 필수 인자는 master와 text 뿐이다. fg, bg, relief 등 대부분의 위젯에서 사용하는 공통 인자 역시 선택적으로 지정하는 것도 가능하다. 

 

Button 객체 호출 시 지정할 수 있는 인자의 목록은 아래와 같다. 굵은 글씨는 기본값이다.

 

< 위젯 필수 속성 값>

필수 속성(인자) 설명 입력값 타입
master 위젯을 배치할 창 또는 위젯(ex: Frame) 지정  tkinter 창 객체 또는 위젯 객체
text Button에 표시할 문자열 지정 문자열(str), 또는 문자열 변수명

 

< 위젯 크기 및 배치 관련 >

선택 속성(인자) 설명 입력값 타입
width Button 위젯의 너비 설정 정수형(Int)
height Button 위젯의 높이 설정 정수형(Int)
padx Button 위젯의 가로 축 여백 지정 정수형(Int)
pady Button 위젯의 세로 축 여백 지정 정수형(Int)

 

< 위젯 디자인 관련 >

선택 속성(인자) 설명 입력값 타입
fg (또는 foreground) Button 위젯의 글자색 설정 색상값 문자열 입력(ex: "red")
bg (또는 background) Button 위젯의 배경색 설정 색상값 문자열 입력(ex: "red")
relief Button 위젯의 테두리 설정 "flat", "sunken", "raised",
"ridge", "solid", "groove"
bd (또는 borderwidth) Button 위젯 테두리 두께 설정 정수형(Int)

 

< 위젯 텍스트 관련 >

선택 속성(인자) 설명 입력값 타입
anchor Button 위젯 내 문자 정렬 위치 설정 "center", "n", "e", "w", "s"
justify Button 위젯 문구가 2줄 이상인 경우 정렬 위치 설정 "center", "left", "right"

 

< 위젯 이미지 관련 >

선택 속성(인자) 설명 입력값 타입
bitmap Button 위젯에 추가할 tkinter 기본 이미지 설정 "info", "warning", "error", 
"question", "questhead", 
"hourglass", "gray12", "gray25", 
"gray50, "gray75"
image Button 위젯에 추가할 이미지 설정 tkinter.PhotoImage 객체
compount Button에 이미지/텍스트 동시 설정 시, 이미지의 위치 지정 "bottom", "top", "center", 
"left", "right"

 

< 위젯 동작 관련 >

선택 속성(인자) 설명 입력값 타입
command Button 클릭 시, 동작하는 함수명 설정 코드 내 함수명
repeatdelay Button 눌림이 유지된 경우,
command 실행까지의 대기시간 설정
정수형(Int): ms 단위로 입력
repeatinterval Button 눌림이 유지된 경우, 
command 반복 실행 주기 설정
정수형(Int): ms 단위로 입력
activebackground Button 클릭 시, 배경색 지정 색상값 문자열 입력(ex: "red")
activeforeground Button 클릭 시, 글자색 지정 색상값 문자열 입력(ex: "red")
disabledforground Button 상태가 disabled인 경우 글자색 지정 색상값 문자열 입력(ex: "red")
overrelief Button 위에 마우스를 올릴 경우, Button 테두리 지정 "flat", "sunken", "raised",
"ridge", "solid", "groove"

 

< 위젯 상태 관련 >

선택 속성(인자) 설명 입력값 타입
state Button의 활성화 여부 설정 "normal", "active", "disabled"



 

2. Button 위젯의 배치

 

Button 위젯의 배치는 pack(), place(), grid()를 사용하면 된다. 자세한 내용은 이 포스팅을 참고하자.

필자는 위젯의 pack() 매서드로 배치를 진행하였고, 결과는 아래와 같다.

 

 

필자가 필수 속성만으로 Button 위젯 2개를 배치했는데, 이 버튼들을 클릭하면 아무런 동작을 하지 않는다. 따라서 선택 속성 중, 필요한 내용만 조금 더 간추려 아래에 설명을 진행하려 한다.

 

 

3. Button에 이미지 삽입

 

Button은 내부에 텍스트 뿐만 아니라 이미지 삽입도 가능하다. 이미지는 tkinter에서 기본으로 제공하는 위젯 이미지, 그리고 사용자가 지정한 외부 이미지를 넣을 수 있다. tkinter 기본 이미지는 bitmap이라는 속성을, 외부 이미지는 image 속성을 사용하여 Button에 삽입하면 된다.

 

필자는 위에서 만든 테스트버튼에 text 속성을 삭제하고 기본 tkinter 이미지를 삽입하려 한다.

 

외부에서 만든 이미지도 마찬가지다. 필자가 빨간 X표시 이미지를 별도의 파일명(icon2.png)으로 지정하고, 아래와 같이 코드를 작성하면, 필자가 만든 이미지도 버튼에 삽입된다.

 

 

단, image 사용 시, 주의해야 할 점이 하나 있는데, image 인자 값 설정 시, PhotoImage 객체변수명을 선언하고 변수명을 넣어야만 동작한다는 것이다. 만약, image = tkinter.PhotoImage(file="icon2.png")로 코드를 작성하면, 버튼에 이미지가 나타나지 않는다. 아마도 버그인 듯 한데... 이유는 모르겠다.

 

마지막으로 Button에 이미지와 text를 둘 다 삽입하는 경우를 살펴보자. text와 image/bitmap이 동시 설정된 경우, 이미지가 text보다 우선하여 Button에 표시된다.

 

만약 이미지와 text를 동시에 표시하고자 할 경우, 선택 속성 중 이미지 위치를 조정할 수 있는 compound를 사용하면 된다. 만약 이미지를 text 좌측에 놓고자 한다면 compount="left"로, 우측에 놓고자 한다면 compount="right"로 설정하면 된다.

 

 

 

4. Button 동작 설정

 

현재 만든 Button 위젯들은 클릭을 해도 아무런 동작을 하지 않는, 소위 말해 깡통이다. 깡통에 생명을 불어넣기 위해 command 속성을 부여해주어야 한다. 이 command는 특정 함수명을 인자값을 지정하면 된다. 필자는 "창 닫기 버튼"을 클릭하면 창이 닫히도록 설정을 해보려 한다. 

 

이를 위해 먼저 창 닫기 기능을 가지는 함수를 만들어야 한다. 함수명을 exit_window로 지정하여 아래와 같이 코드를 작성한다.

 

 

그리고 이 함수명을 button2의 command 속성에 부여하면, "창 닫기 버튼" 클릭 시 창이 닫히게 된다.

 

 

 

 

command 지정 시, 버튼을 단순히 클릭하면 command의 함수가 동작하지만, 눌린 상태로 유지되는 경우 버튼을 떼기 전까지는 함수가 동작하지 않는다. 만약 버튼이 눌린 상태(active)가 유지되는 경우 함수가 동작하도록 만들려면, repeatdelay 인자를 사용하면 된다. 인자값은 millisecond 단위로 작성하면 되며, 버튼을 지정한 millisecond 이상 클릭 유지하고 있는 경우 함수가 자동으로 동작한다.

 

만약, 버튼 클릭이 유지될 때 함수를 지속적으로 반복 수행하고 싶다면, repeatinterval 값을 추가로 지정해주면 된다. repeatdelay와 마찬가지로 millisecond 값을 지정하면 된다. 버튼 클릭이 유지되는 경우 repeatinterval 간격으로 함수가 재실행된다. 참고로 repeatinterval 인자 사용을 위해 command와 repeatdelay 속성이 지정되어 있어야 한다. 사실상 잘 사용하는 인자는 아니라 별도로 시연 화면을 캡쳐하진 않는다.

 

 

 

5. Button 상태 설정

 

Button의 상태는 state라는 속성으로 설정하면 된다. Button의 상태는 크게 세 가지로 나뉜다. 일반 상태인 "normal", 버튼 클릭 상태인 "active", 버튼 비활성화 상태인 "disabled".

 

button2번, "창 닫기 버튼"을 필자가 비활성화하게되면, 창에 나타나는 button2은 클릭이 불가한 상태로 변경된다. 

 

 

 

 


 

오늘 작성한 포스팅에 대한 코드도 지난 번과 동일하게 첨부파일로 공유한다. 

005_tkinter_Button.py
0.00MB

 

다음 포스팅에서는 tkinter.Listbox 위젯의 생성/배치 및 동작까지 구현해보려 한다.

 

 

Fin.

반응형

댓글