System Tray Icon

Merhaba, ufak bir sorum olacak. Python ile yazdığımı programı system tray icon olarak göstermek istiyorum
bu işlemi yaparken program gizlenecek ama arkada çalışmaya devam edecek ve taskbar icon una tıkladığım zaman da program açılacak bunu nasıl yapabilirim?

Merhaba, konu hakkında çok bilgim yok. Ancak yaptığım araştırmalara göre bulduğum çözüm önerileri işletim sistemlerine göre değişiyor.

Windows için aşağıdaki yöntemi inceleyebilirsiniz:

pip install pypiwin32
from win32api import *
from win32gui import *
import win32con
import sys
import os
import time


class WindowsBalloonTip:
    def __init__(self, title, msg):
        message_map = {
                win32con.WM_DESTROY: self.on_destroy,
        }
        wc = WNDCLASS()
        hinst = wc.hInstance = GetModuleHandle(None)
        wc.lpszClassName = "PythonTaskbar"
        wc.lpfnWndProc = message_map
        class_atom = RegisterClass(wc)

        style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
        self.hwnd = CreateWindow(class_atom, "Taskbar", style, 0, 0, win32con.CW_USEDEFAULT,
                                 win32con.CW_USEDEFAULT, 0, 0, hinst, None)
        UpdateWindow(self.hwnd)
        icon_path_name = os.path.abspath(os.path.join(sys.path[0], "icon.png"))
        print(icon_path_name)
        icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
        try:
            hicon = LoadImage(hinst, icon_path_name, win32con.IMAGE_ICON, 0, 0, icon_flags)
        except:
            hicon = LoadIcon(0, win32con.IDI_APPLICATION)
        flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
        nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, "cloud")
        Shell_NotifyIcon(NIM_ADD, nid)
        Shell_NotifyIcon(NIM_MODIFY,
                         (self.hwnd, 0, NIF_INFO, win32con.WM_USER+20,
                          hicon, "Balloon  tooltip", msg, 200, title))
        time.sleep(10)
        DestroyWindow(self.hwnd)

    def on_destroy(self):
        nid = (self.hwnd, 0)
        Shell_NotifyIcon(NIM_DELETE, nid)
        PostQuitMessage(0)


def balloon_tip(title, msg):
    WindowsBalloonTip(title, msg)


if __name__ == '__main__':
    balloon_tip("Opening from cloud", "File open")

Linux için ise aşağıdaki yöntemi inceleyebilirsiniz:

Not: PyQt4 modülü Windows’da da çalışmaktadır.

PyQt4 modülünün Windows’a kurulumu:

  1. Bu siteden sisteminize uygun olan whl dosyasını indirin. İndireceğiniz dosya şuna benzemelidir. --> PyQt4-4.11.4-cp35-cp35m-win_amd64.whl --> Örneğin bu sürüm Python 3.5 ve Windows 64 bit içindir.

  2. Dosyanın indiği dizinde cmd’yi açın ve aşağıdaki komutu yazın:

pip install PyQt4-4.11.4-cp35-cp35m-win_amd64.whl
# İndirdiğiniz sürümün adı neyse onu yazın.
  1. Bu sitede, programın çalışabilmesi için gerekli olan msvcp140.dll isimli bir dll dosyası mevcut. Onu bilgisayarınıza indirin ve PyQt4’ün bulunduğu dizine atın.
import sys
from PyQt4 import QtGui


class SystemTrayIcon(QtGui.QSystemTrayIcon):
    def __init__(self, icon, parent=None):
        QtGui.QSystemTrayIcon.__init__(self, icon, parent)
        self.menu = QtGui.QMenu(parent)
        exitAction = self.menu.addAction("Exit")
        self.setContextMenu(self.menu)


def main():
    app = QtGui.QApplication(sys.argv)
    style = app.style()
    icon = QtGui.QIcon(style.standardPixmap(QtGui.QStyle.SP_FileIcon))
    tray_icon = SystemTrayIcon(icon)
    tray_icon.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Yukarıdaki kodlar çalışır durumdadır ancak hem windows’da hem de linux’de sistem tepsisinde gözüken simgelere tıkladığım zaman bir menü açılmadı. Her iki modül konusunda da bilgim yetersiz olduğu için simgelere tıklandığında program nasıl açılır bilmiyorum. Modülleri incelediğinizde bahsettiğim işlemin nasıl yapıldığını öğrenebileceğinizi sanıyorum.

İkonu değiştirmek için özellikler panelini kullanabilirsiniz ama başka bilgisayarlarda veya işletim sistemlerinde denediğinizde ne olur bilmen