tkinter에서 icon 등록 방법

문제

python으로 GUI를 만들 때 tkinter를 사용한다. GUI 제작 시 아이콘을 등록해야 하는 경우가 있다. 아이콘 등록하는 방법은 아래와 같이 Tk 클래스의 iconbitmap("아이콘이 있는 주소")를 사용하면 아이콘을 등록할 수 있다.

window = tkinter.Tk()
window.iconbitmap('icon.ico')

하지만 실행하면 아래와 같은 오류가 발생했다.

_tkinter.TclError: bitmap “icon.ico” not defined

bitmap 형식이 아니라서 오류가 발생한 것이다.


해결 방법

  1. bitmap 형식의 .ico 파일 다운로드

tkinter의 iconbitmap 함수는 .ico 형식만 허용한다. 따라서 jpgpng 파일을 아이콘으로 사용할 수 없다. .jpg 파일을 .ico로 강제 변환해도 제대로 동작하지 않는다. 구글에서 다양한 .ico 파일을 찾을 수 있으니 저작권을 꼭 확인하고 사용하면 된다.

  1. .tk.call() 함수 사용

iconbitmap 대신 tk.call('wm', 'iconphoto', 클래스변수._w, tkinter.PhotoImage(file='아이콘 경로'))를 사용하는 방법이 있다. 이 방식은 png, jpg 같은 이미지 파일을 아이콘으로 등록할 수 있게 해준다.

window = tkinter.Tk()
   window.tk.call('wm', 'iconphoto', window._w, tkinter.PhotoImage(file='icon.png'))

---

## 추가
exe 파일로 만들었을 때 icon.ico 파일이 없다는 오류가 발생할 수 있다. 이런 경우 아이콘 파일을 외부에서 다운받아 실행하면 된다.

### 외부에서 파일을 다운로드하는 방법
외부에서 이미지를 다운로드하여 icon으로 설정하는 방법은 pycurl을 사용하는 것이다.

python
import pycurl

file_name = ‘icon.png’
url = “https://play-lh.googleusercontent.com/h9jWMwqb-h9hjP4THqrJ50eIwPekjv7QPmTpA85gFQ10PjV02CoGAcYLLptqd19Sa1iJ”

with open(file_name, ‘wb’) as f:
cl = pycurl.Curl()
cl.setopt(cl.URL, url)
cl.setopt(cl.WRITEDATA, f)
cl.perform()
cl.close()

위 코드를 실행하면 지정된 URL에서 이미지를 다운로드하여 icon.png로 저장된다. 이후 tk.call()을 사용해 아이콘으로 설정하면 된다.

### 외부 주소를 통해 저장하고 icon 지정하는 코드

python
import pycurl
import tkinter

window = tkinter.Tk()

외부 주소에서 이미지 다운로드

file_name = ‘icon.png’
url = “https://cdn-icons.flaticon.com/png/128/3955/premium/3955024.png?token=exp=1659283565~hmac=8d0dfdfe817fefca793539364da92648”

with open(file_name, ‘wb’) as f:
cl = pycurl.Curl()
cl.setopt(cl.URL, url)
cl.setopt(cl.WRITEDATA, f)
cl.perform()
cl.close()

아이콘으로 등록

window.tk.call(‘wm’, ‘iconphoto’, window._w, tkinter.PhotoImage(file=’icon.png’))

실행

window.mainloop()
“`

결과

위로 스크롤