Kafayı yiyecektim vallahi. Ana uygulamam, verileri çekiyor, işliyor, güzel güzel bir arayüzde gösteriyor. Ama kullanıcı "arkada çalışsın, simgeye tıklayınca açılsın" dediğinde, işler çığırından çıktı.
Basit Bir İstek, Karmaşık Bir Cehennem
Düşünsene, ana mantık belki 200 satır. Ama system tray için yazdığım kod neredeyse 300 satırı buldu! Menü oluşturma, simge değiştirme, tıklama olaylarını yakalama, pencereleri gizleyip gösterme, çift tıklamayı engelleme... Her biri ayrı bir dert. PyQt5'in QSystemTrayIcon'ı ile başladım, meğer ne çetrefilli bir dünyaymış.
Terminal İsyanım
Ana uygulamamda bir hata olsa, terminale bakarım, stack trace okurum hallederim. Ama bu sistem tepsisindeki simge öyle değil. Bazen tıklanmıyor, bazen gizlenmiyor, bazen de uygulama kapanmıyor arka planda sinsi sinsi çalışmaya devam ediyor. Debug etmek için print() bile yazamıyorsun, çünkü arka planda çalışıyor. Şaka gibi ama log dosyası yazmak zorunda kaldım sadece bu tepsi işi için.
Çözüm(?) ve İsyan
Nihayetinde, olayları (event) doğru bağlamayı, uygulamanın kapanma akışını (quit) tepsi menüsüne entegre etmeyi ve threading ile ana işlemi bloklamamayı hallettim. Ama şu soru aklımı kemiriyor: Neden böyle oldu? Neden basit bir "simgeye tıkla, açılsın" özelliği, ana iş mantığından daha fazla efor ve kod gerektirsin?
Siz de böyle oldu mu? Bir özellik ekleyeyim derken, o özelliğin altyapısının asıl işin önüne geçtiği? System tray için daha temiz, daha sade bir kütüphane veya yöntem biliyor musunuz? Yoksa bu karmaşa kaçınılmaz mı?
Düşünsene, ana mantık belki 200 satır. Ama system tray için yazdığım kod neredeyse 300 satırı buldu! Menü oluşturma, simge değiştirme, tıklama olaylarını yakalama, pencereleri gizleyip gösterme, çift tıklamayı engelleme... Her biri ayrı bir dert. PyQt5'in QSystemTrayIcon'ı ile başladım, meğer ne çetrefilli bir dünyaymış.
Ana uygulamamda bir hata olsa, terminale bakarım, stack trace okurum hallederim. Ama bu sistem tepsisindeki simge öyle değil. Bazen tıklanmıyor, bazen gizlenmiyor, bazen de uygulama kapanmıyor arka planda sinsi sinsi çalışmaya devam ediyor. Debug etmek için print() bile yazamıyorsun, çünkü arka planda çalışıyor. Şaka gibi ama log dosyası yazmak zorunda kaldım sadece bu tepsi işi için.
Python:
# Simgeyi oluştur ve göster... (kolay kısmı)
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon('icon.png'))
self.tray_icon.show()
# Şimdi asıl macera: menü, olaylar, durum yönetimi...
Nihayetinde, olayları (event) doğru bağlamayı, uygulamanın kapanma akışını (quit) tepsi menüsüne entegre etmeyi ve threading ile ana işlemi bloklamamayı hallettim. Ama şu soru aklımı kemiriyor: Neden böyle oldu? Neden basit bir "simgeye tıkla, açılsın" özelliği, ana iş mantığından daha fazla efor ve kod gerektirsin?
Siz de böyle oldu mu? Bir özellik ekleyeyim derken, o özelliğin altyapısının asıl işin önüne geçtiği? System tray için daha temiz, daha sade bir kütüphane veya yöntem biliyor musunuz? Yoksa bu karmaşa kaçınılmaz mı?