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은 클릭이 불가한 상태로 변경된다.
오늘 작성한 포스팅에 대한 코드도 지난 번과 동일하게 첨부파일로 공유한다.
다음 포스팅에서는 tkinter.Listbox 위젯의 생성/배치 및 동작까지 구현해보려 한다.
Fin.
'Python > Python tkinter' 카테고리의 다른 글
[Python tkinter] 7. Entry 위젯 생성 (0) | 2022.02.18 |
---|---|
[Python tkinter] 6. Listbox 위젯 생성 및 목록 설정 (0) | 2022.02.06 |
[Python tkinter] 4. Label 위젯으로 창에 글자 각인하기 (0) | 2022.01.23 |
[Python tkinter] 3. Frame 위젯으로 창 구획 나누기 (0) | 2022.01.16 |
[Python tkinter] 2. 빈 창에 위젯(Widget) 생성하기 (0) | 2022.01.12 |
댓글