본문 바로가기
코딩/30초 코딩비법

[30초 코딩비법] tkinter에서 icon을 생성

by 컴공돌멩이 2022. 8. 7.
728x90

python으로 GUI를 만들기 위해 tkinter를 사용한다.

 

gui 제작 시 아이콘을 등록해야하는 경우가 있다.

 

아이콘 등록하는 방법은 아래와 같이 Tk클래스 변수.iconbitmap("아이콘이 있는 주소")를 사용하면 아이콘을 등록할 수 있다.

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

 

 

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

_tkinter.TclError: bitmap "icon.ico" not defined

bitmap형식이 아니라서 오류가 났다는 것이다.


해결방법.

 

1. bitmap형식으로 되어있는 .ico 파일을 다운

  실제 bitmap형식으로 되어있는 .ico 파일을 다운받는 방법이 있다. 위 함수는 jpg나 png형식은 허용하지 않는다.

실험 해보았는데 jpg파일을 ico로 강제 변환 했는데도 안된다. 구글에 찾으면 아이콘 많이 나오기 때문에 저작권 잘 찾아서 이용하면 된다.

 

2. .tk.call()함수

  클래스변수.tk.call('wm', 'iconphoto', 클래스변수._w, tkinter.PhotoImage(file = '주소/아이콘.png'))를 사용하는 방법이다.

이 방법을 사용하면 png, jpg 확장자 모두 아이콘으로 사용할 수 있다.

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

+ 추가

exe파일을 만들었는데 icon.ico파일이 없다고 실행되지 않는다. 이럴 경우 같이 동봉하는 방법이 있지만 나는 exe파일만 실행하고 싶었다. 이렇게 외부에서 이미지를 다운받아 프로그램을 실행해야 할 경우 외부에서 파일을 다운 받아서 실행하면 된다.

 

외부에서 파일을 다운로드 하는 방법 중 아래와 같이 pycurl을 사용하는 방법은 아래와 같다.

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으로 만들면 외부에서 다운로드 받아 icon으로 지정하면 이를 해결할 수 있다.

 

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

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()

 

결과.

아이콘 등록 후 사진

 

 

 

누르면 오픈채팅방으로 이동합니다.

728x90

댓글