728x90
반응형
😟 문제 상황
iconbitmap() 함수를 사용해 .ico 아이콘을 설정했더니,
윈도우 제목표시줄 아래쪽 경계선(프레임 테두리)이 깨지는 현상이 발생했다.
(오른쪽 사진의 빨간 네모 박스 부분을 유심히 봐보자)
# app.py
import tkinter as tk
from layout import setup_main_ui
root = tk.Tk()
root.title("로또 번호 생성기")
root.resizable(False, False)
root.iconbitmap("icon32.ico")
# ui
setup_main_ui(root)
root.mainloop()
❗ 왜 이런 문제가 발생할까?
인터넷을 뒤져봐도 답이 안나오길래 chatGPT에게 물어봤다.
chatGPT)
결론부터 말하자면 Tkinter에서 iconbitmap() 사용 후 경계선이 깨지는 현상에 대한 정확한 공식 문서상의 원인 설명은 존재하지 않습니다. 다만, 여러 커뮤니티 사례와 Tkinter 내부 구조를 토대로 다음과 같이 기술적인 원인 추정이 가능합니다.
예..?? 😵💫이러면 정확하게 이해를 못하잖아..!
여튼 chatGPT가 말하는 기술적인 원인 추정은 아래와 같다.
chatGPT)
🧩 이유 1.
iconbitmap() 호출이 윈도우 스타일 핸들에 영향을 미침
Tkinter의 iconbitmap()은 내부적으로 WM_SETICON 메시지를 사용하여 OS의 윈도우 스타일을 변경합니다.
이때, 생성된 윈도우가 이미 일부 스타일을 가진 상태라면,
프레임 경계선(highlightcolor, relief) 등 시각적 요소가 재정의되지 않을 수 있습니다.
즉, 아이콘 변경이 내부적으로 OS 스타일 처리 순서를 건드리는 것이고,
Frame의 시각적 테두리 요소가 적용되기 전에 UI가 조기 렌더링될 가능성이 있습니다.
🧩 이유 2.
highlightcolor와 highlightthickness는 포커스 제어 전용이기 때문
많은 사람들이 사용하는 highlightcolor는 실제로 포커스가 들어왔을 때에만 보이는 경계선 색상입니다.
따라서 bd가 0이거나, 포커스가 없다면 아무 효과도 보이지 않습니다. 이걸 착각하고 "색상이 안 나와!"라고 느끼는 경우도 많습니다.
🤔 그래서 어떻게 해결해야 해?
- Frame에 relief="groove"나 "ridge", bd=2~3 같이 기본 테두리 스타일을 사용하는 것이 안정적
- .ico는 32x32, 256-color 이하 포맷으로 저장
이라는 답변을 받았다.
결국 나는 Frame에 relief 옵션과 bd를 적용하는 방향으로 해결했다.
# layout.py
intro_frame = Frame(root, relief="groove", bd=3)
intro_frame.pack(fill="both")
엄청 자세하게 보지 않으면 티가 나지 않아 나름 만족했다.
📌 결론
- .ico 아이콘 설정은 간단해 보이지만, 예상치 못한 UI 깨짐 현상이 생길 수 있다.
- 이럴 땐 relief, bd 설정을 조정하거나 UI 구성 순서를 바꿔보며 대응하는 것이 좋다.
뭔가 찝찝함만 남은 트러블 슈팅이었다.
728x90
반응형
'STUDY > Python' 카테고리의 다른 글
백준 BAEKJOON 33845번 PNUPC에 한 번도 빠지지 않고 출연한 산지니가 새삼 대단하다고 느껴지네 [PYTHON/파이썬] (0) | 2025.06.12 |
---|---|
[Tkinter] 함수가 왜 미리 실행될까? (1) | 2025.06.11 |
[Tkinter] Tkinter 폰트(font) 설정과 활용 정리 (0) | 2025.06.05 |
[Tkinter] Tkinter를 활용하여 간단한 메모장 프로그램 만들기 (0) | 2025.04.27 |
Python의 Zip 함수를 활용한 2차원 배열 전환 방법 (0) | 2024.03.19 |