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()
결과.
'코딩 > 30초 코딩비법' 카테고리의 다른 글
[30초 코딩비법] TypeError: no numeric data to plot 오류 해결 (1) | 2022.09.06 |
---|---|
[30초 코딩비법] BeautifulSoup 설치 방법 (0) | 2022.08.28 |
[30초 코딩비법] JVMNotFoundException 오류 해결 (0) | 2022.08.20 |
[30초 코딩비법] UnicodeDecodeError 해결 (0) | 2022.08.09 |
[30초 코딩비법] 셀레니움으로 aria-label값 가져오기 (0) | 2022.07.26 |
댓글