프로그래밍/Python
간단히 파이썬 트레이 아이콘(pystray) 사용하기(multiprocessing과 함께)
꿈꾸는 사람_Anthony
2020. 11. 30. 23:14
반응형
모듈 : pystray
간단하게 트레이 아이콘형태로 응용 프로그램을 제작하고 싶을 때 사용한다.
https://github.com/moses-palmer/pystray/blob/master/docs/usage.rst
사용법에는 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()는 생성된 프로세스간 데이터를 주고받을 때 사용한다.
반응형