프로그래밍/Python
간단히 파이썬 트레이 아이콘(pystray) 사용하기(multiprocessing과 함께)
꿈꾸는 사람_Anthony
2020. 11. 30. 23:14
반응형
모듈 : pystray
간단하게 트레이 아이콘형태로 응용 프로그램을 제작하고 싶을 때 사용한다.
https://github.com/moses-palmer/pystray/blob/master/docs/usage.rst
moses-palmer/pystray
Contribute to moses-palmer/pystray development by creating an account on GitHub.
github.com
사용법에는 PIL로 트레이 아이콘 이미지를 만드는 법이 소개되어있지만, 다음과 같이 사용해도 된다.
from pystray import MenuItem as item
import pystray
from PIL import Image
def action():
pass
image = Image.open("image.jpg")
menu = (item('name', action), item('name', action))
icon = pystray.Icon("name", image, "title", menu)
icon.run()
출처 : https://stackoverrun.com/ko/q/12905902
https://stackoverflow.com/questions/47095129/pystray-systray-icon
그리고
icon.stop()
은 트레이 아이콘의 작동을 중지시킨다.
추가적으로, pystray는 icon.run() 실행하면 그 이후의 코드들은 icon.stop()이 실행될때까지 실행되지 않는다.
이것을 해결하는 방법이 있을 것으로 생각되지만, 찾기가 어려워 필자는 multiprocessing 의 Process를 사용하는 것으로 대체했다.
기본적인 틀은 다음과 같다.
from pystray import MenuItem as item
import pystray
from PIL import Image
from multiprocessing import Process, Queue
def func1(q):
if (not q.empty()) and str(q.get()) == 'stop':
return False
pass
def action():
icon.stop()
q.put('stop')
if __name__ == '__main__':
q = Queue()
p_func1 = Process(target=func1, args=(q,))
p_func1.start()
##Below : Tray
image = Image.open("image.jpg")
menu = (item('종료', action), )
icon = pystray.Icon("name", image, 'title', menu)
icon.run()
##Up : Tray
q.close()
q.join_thread()
p_combine.join()
여기서 Queue()는 생성된 프로세스간 데이터를 주고받을 때 사용한다.
반응형