# 시그널과 콜백 함수(Python)

GTK+의 시그널과 콜백 함수를 설명합니다.
Sebastian Pölsterl
sebp@k-d-w.org 2011
Marta Maria Casetti
mmcasetti@gmail.com 2012
조성호
shcho@gnome.org 2017-2019.

# 시그널과 콜백 함수

# 개요

GUI 툴킷처럼 GTK+ 에도 이벤트 주도 프로그래밍 모델을 사용합니다. 사용자가 아무 동작도 취하지 않으면 GTK+는 메인 루프상에 머무르며 입력을 기다립니다. 사용자가 어떤 동작을 취하면 - 마우스 클릭이라 칩시다 - 메인 루프가 "깨어나고" GTK+에 이벤트를 전달합니다.

위젯에서 이벤트를 받으면 하나 이상의 시그널을 내보냅니다. 시그널은 프로그램에 "기다리고 있던 무슨 일이 일어났다"는 사실을 시그널에 연결한 함수를 실행하여 알립니다. 이런 함수는 보통 콜백이라고 합니다. 콜백 함수를 실행하면 보통 어떤 동작을 취합니다. 콜백 함수 실행이 끝나면 GTK+에서 메인 루프로 돌아와서 다른 사용자의 입력을 기다립니다.

일반적인 예를 들자면 `handler_id = widget.connect("event", callback, data)` 코드가 있습니다. `widget`는 우리가 앞서 만든 인스턴스입니다. 그 다음 `event`는 우리가 기다리는 부분입니다. 각 위젯은 사용자의 동작으로 나타나는 자체 이벤트가 있습니다. 예를 들어 Gtk.Button에서 보통 여러분은 "clicked" 이벤트에 연결하고 싶어합니다. 단추를 누르면 시그널이 나온단 얘깁니다. 다른 예를 들자면 `notify::property` 시그널을 들 수 있습니다. GObject에서 언제든 property를 수정했든지간에 `notify` 시그널을 내보내는 대신, GObject에서 수정한 속성 이름으로 더욱 자세한 상황을 시그널로 내보냅니다. 이런 방식을 통해 여러 이벤트 중 오직 하나의 속성이 바뀐 사실에 대해서만 받을 수 있습니다. 세번째로 이 콜백 매개변수는 콜백 함수의 인자 이름이며, 이 매개변수에는 지정 형식으로 시그널을 내보냈을때 실행할 코드가 들어있습니다. 마지막으로, 추가 데이터 인자에는 시그널을 내보냈을 떄 전달해야 할 데이터가 들어갑니다.

함수에서는 이 시그널-콜백 함수 쌍을 구분하는 번호(`handler_id`) 값을 반환합니다. 이 번호 값은 `widget.disconnect(handler_id)` 처럼 시그널에서 앞으로 쓸 일이 없는 콜백 함수를 끊거나 시그널을 계속 내보내는 상황일 경우 필요합니다.

# 참고 자료

GObject 문서의 시그널

Python GTK+ 3 따라하기 지침의 메인 루프와 시그널 기본