STUDY/Python

[Tkinter] 아이콘 설정 후 경계선이 깨지는 현상

칼코 2025. 6. 26. 17:35
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이거나, 포커스가 없다면 아무 효과도 보이지 않습니다. 이걸 착각하고 "색상이 안 나와!"라고 느끼는 경우도 많습니다.

 


🤔 그래서 어떻게 해결해야 해?

  1. Frame에 relief="groove"나 "ridge", bd=2~3 같이 기본 테두리 스타일을 사용하는 것이 안정적
  2. .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
반응형