프로그래밍/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()는 생성된 프로세스간 데이터를 주고받을 때 사용한다.

반응형