tk fontchooser — 글꼴 선택 대화상자 제어하기
tk fontchooser — 글꼴 선택 대화상자 제어하기
프로그램 안에서 사용자가 글꼴을 직접 고를 수 있게 하려면 어떻게 해야 할까요? Tk는 플랫폼 기본 글꼴 선택 대화상자를 띄워 주는 tk fontchooser 명령을 제공해요. 운영체제가 네이티브 대화상자를 지원하면 그걸 사용하고, 그렇지 않으면 Tcl로 구현된 대화상자를 사용합니다.
본문
개요
tk fontchooser 명령은 Tk 글꼴 선택 대화상자를 제어합니다. 플랫폼이 제공하는 네이티브 글꼴 선택 대화상자를 사용할 수 있으면 그걸 쓰고, 아니면 Tcl로 구현된 대화상자를 사용해요.
다른 Tk 대화상자 명령들과 달리 tk fontchooser는 즉시 결과를 돌려주지 않아요. macOS 같은 플랫폼에서는 표준 글꼴 대화상자가 모달리스(modeless)로 동작하고, Windows 같은 곳에서는 모달(modal)로 동작하기 때문이에요. 이런 차이를 맞추기 위해 대화상자와의 모든 상호작용은 콜백이나 가상 이벤트로 호출자에게 전달됩니다.
명령은 다음 형태 중 하나를 가질 수 있어요.
tk fontchooser configure ?-option value ...?
tk fontchooser show
tk fontchooser hide
tk fontchooser configure ?-option value ...? — 아래 설정 옵션 중 하나 이상을 설정하거나 조회합니다. Tk 위젯 설정과 비슷하게 동작해요.
tk fontchooser show — 글꼴 선택 대화상자를 표시합니다. 플랫폼에 따라 즉시 반환할 수도 있고, 대화상자가 내려간 뒤에야 반환할 수도 있어요.
tk fontchooser hide — 대화상자가 보이는 상태라면 숨기고, 대기 중인 tk fontchooser show 명령이 반환되도록 합니다.
설정 옵션
-parent — 글꼴 선택 대화상자의 논리적 부모 창을 지정하거나 돌려줍니다. 다른 대화상자들의 -parent 옵션과 비슷해요. 부모 창이 파괴되는 순간 대화상자가 보이는 중이었다면 함께 숨겨집니다.
-title — 대화상자의 제목을 지정하거나 돌려줍니다. 글꼴 선택 대화상자가 제목을 지원하지 않는 플랫폼에서는 아무 효과가 없어요.
-font — 대화상자에 현재 선택된 글꼴을 지정하거나 돌려줍니다. 대화상자가 보이지 않는다면, 표시될 때 처음 선택될 글꼴을 뜻해요. 플랫폼이 지원할 때만 해당하죠. 빈 문자열로 설정하면 어떤 글꼴도 선택되지 않음을 나타냅니다. 글꼴은 font 매뉴얼 페이지의 "FONT DESCRIPTION" 섹션에 나오는 어떤 형태로든 지정할 수 있어요.
-command — 사용자가 글꼴을 선택했을 때 호출될 명령 프리픽스를 지정하거나 돌려줍니다. 명령 프리픽스는 선택된 글꼴의 스펙이 뒤에 붙은 채 전역 레벨에서 평가되요. 글꼴 선택 대화상자가 색 같은 추가 글꼴 속성의 제어를 제공하는 플랫폼에서는 평가 전에 추가 키/값 쌍이 더 붙을 수도 있어요. 빈 문자열로 설정하면 콜백이 호출되지 않음을 나타냅니다. 글꼴은 "FONT DESCRIPTION" 섹션의 [3] 형태, 즉 {family size style ?style ...?} 형태의 리스트로 지정돼요.
-visible — 읽기 전용 옵션으로, 대화상자가 현재 보이는지 여부를 불리언으로 돌려줍니다. 이 옵션을 설정하려 하면 오류가 발생해요.
가상 이벤트
<<TkFontchooserVisibility>> — 글꼴 선택 대화상자의 표시 여부가 바뀔 때마다 대화상자 부모에게 전달됩니다. 사용자가 OK/Cancel 버튼이나 닫기 상자로 대화상자를 닫는 경우뿐 아니라 tk fontchooser show/hide 명령이 호출될 때도 발생해요. 바인딩 스크립트는 -visible 설정 옵션을 조회해서 현재 표시 여부를 알 수 있습니다.
<<TkFontchooserFontChanged>> — 대화상자가 보이는 상태에서 선택된 글꼴이 바뀔 때마다 대화상자 부모에게 전달됩니다. 사용자 동작으로든 -font 설정 옵션이 설정되어서든 발생해요. 바인딩 스크립트는 -font 설정 옵션을 조회해서 현재 선택된 글꼴을 알 수 있습니다.
주의사항
tk fontchooser show의 결과를 기대해서는 안 돼요. 명령이 반환됐다고 해서 대화상자가 닫히거나 내려갔다고 가정할 수 없어요. 대화상자와의 모든 상호작용은 -command 콜백과 <<TkFontchooser*>> 가상 이벤트를 통해 전달됩니다. 어떤 사용자 동작이 콜백을 부르고 가상 이벤트를 보내는지는 구현에 따라 달라져요. 대화상자에 Apply나 OK 버튼이 있으면 그 버튼이 -command 콜백과 <<TkFontchooserFontChanged>> 가상 이벤트를 유발합니다. 일부 구현에서는 다른 사용자 동작도 같은 효과를 낼 수 있어요. 예를 들어 macOS에서는 표준 글꼴 선택 대화상자가 모든 사용자 선택을 즉시 호출자에게 반영합니다.
여러 위젯이 글꼴 선택 대화상자의 영향을 받도록 하려면 포커스 변화를 올바르게 처리해야 해요. 대화상자에서 선택된 글꼴은 항상 포커스를 가진 위젯의 현재 글꼴과 일치해야 하고, -command 콜백은 포커스를 가진 위젯에만 작용해야 합니다. 권장하는 방법은 위젯별 <FocusIn> 핸들러에서 대화상자 -font와 -command 설정 옵션을 지정하고(필요하면 <FocusOut> 핸들러에서 빈 문자열로 해제하고), 라이브러리 코드를 만든다면 응용 코드와 충돌하지 않도록 특히 주의하는 거예요.
글꼴 선택 대화상자는 응용 전역으로 동작합니다. 여러 인터프리터가 tk fontchooser를 호출할 때, 사용자 동작에 응답해 호출되는 -command 콜백은 가장 최근에 configure나 show를 호출한 인터프리터가 설정한 것뿐이에요. <<TkFontchooser*>> 가상 이벤트를 받는 -parent도 마찬가지로 그 인터프리터가 설정한 것뿐입니다.
또한 대화상자 구현이 -font 옵션 값으로 font actual 데이터만 저장하고 돌려줄 수도 있어요. 이름 있는 글꼴을 -font로 설정했는데 그 글꼴이 나중에 바뀌면, 대화상자 -font 옵션을 다시 설정해 선택된 글꼴이 이름 있는 글꼴의 새 값과 일치하도록 맞춰줘야 해요.
예제
proc fontchooserDemo {} {
wm title . "Font Chooser Demo"
tk fontchooser configure -parent .
button .b -command fontchooserToggle -takefocus 0
fontchooserVisibility .b
bind . <<TkFontchooserVisibility>> \
[list fontchooserVisibility .b]
foreach w {.t1 .t2} {
text $w -width 20 -height 4 -borderwidth 1 -relief solid
bind $w <FocusIn> [list fontchooserFocus $w]
$w insert end "Text Widget $w"
}
.t1 configure -font {Courier 14}
.t2 configure -font {Times 16}
pack .b .t1 .t2; focus .t1
}
proc fontchooserToggle {} {
tk fontchooser [expr {
[tk fontchooser configure -visible] ?
"hide" : "show"}]
}
proc fontchooserVisibility {w} {
$w configure -text [expr {
[tk fontchooser configure -visible] ?
"Hide Font Dialog" : "Show Font Dialog"}]
}
proc fontchooserFocus {w} {
tk fontchooser configure -font [$w cget -font] \
-command [list fontchooserFontSelection $w]
}
proc fontchooserFontSelection {w font args} {
$w configure -font [font actual $font]
}
fontchooserDemo