Unbound olan bir pyqt signalini nasıl bound yapabilirim

Python bir uygulama yaptım uygulamanın arayüzünde start stop diye düğmeler var adından da anlaşılacağı üzere işlemi başlatıp durduruyor bunu kısayolla da yapılabilmesini istedim. Bu işlem başlayınca durdur kısayoluna/düğmesine basılmadıkça devam edeceği için QShortcut kullanamazdım (Yanlışta düşünüyor olabilirim lütfen belirtin yanlışsa). Bu yüzdende keyboard modülü ile yapmayı denedim ama direk add_hotkey ile kısayol ekleyince yanıt vermiyor alıyordum add_hotkeyi pyqtsignale bağlayarak çözdüm. Kod bu şekildeydi:

class KeyBoardManager(QObject):
    ctrlk = pyqtsignal()
    def start(self):
        add_hotkey("ctrl+k", self.ctrlk.emit, suppress=True)

class window(QMainWindow):
    def __init__(self):
        super().__init__()
        manager = KeyBoardManager(self)
        manager.ctrlk.connect(lambda :self.islem())
        manager.start()

Bunu daha kolay bir hale getirmeye çalışıyordum ama bir sorunla karşılaştım bu signali bir sözlükten çekmeye çalışınca signal unboundda kalıyor bound olmuyor onun içinde

AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

böyle hata alıyorum. Kod böyle:

class KeyBoardManager(QObject):

    hotkeys = {}
    signals = {}

    def add_hotkey(self,hotkey, callback, args=(), suppress=False, timeout=1, trigger_on_release=False):

        self.signals[hotkey] = pyqtSignal()
        self.signals[hotkey].connect(callback)
        self.hotkeys[hotkey] = {
            "callback":self.signals[hotkey].emit,"args":args,"suppress":suppress,"timeout":timeout,trigger_on_release:False
        }

    def start(self):
        for h,j in self.hotkeys:
            add_hotkey(h,j["callback"],args=j["args"],suppress=j["subpress"],timeout=j["timeout"],trigger_on_release=j["trigger_on_release"])

Bu signal neden unbound da kalıyor, nasıl bounda geçirim, veya bu yanıt vermiyor hatasının daha kolay/alternatif bir çözümü var mıdır varsa nedir yardımcı olursanız sevinirim.

class Hotkey(QObject):
    signal = pyqtSignal()

    def __init__(self, hotkey, callback, args=(), suppress=False, timeout=1, trigger_on_release=False):
        super().__init__()
        self.callback = callback
        add_hotkey(hotkey, self.signal.emit, args=args, suppress=suppress, timeout=timeout,
                   trigger_on_release=trigger_on_release)



class KeyboardManager(QObject):
    hotkeys = {}

    def add_hotkey(self, hotkey, callback, args=(), suppress=False, timeout=1, trigger_on_release=False):
        self.hotkeys[hotkey] = Hotkey(hotkey, callback, args=args, suppress=suppress, timeout=timeout,
                    trigger_on_release=trigger_on_release)

    def start(self):
        for hk in self.hotkeys.values():
            hk.signal.connect(hk.callback)

Bu şekilde bir şey yaptım oldu ama daha kolay bir yöntem vardır belki.

Normal bir sinyal/mailbox senkronizasyon objesi olarak dusunmussunuz. Bu cok guzel bir dusunce, fakat Qt icin fazla ileri seviye kaliyor. Qt biraz magic (sihir; yazilmayan kod, ayni buyuyu calismamis insanlarin anlamayacagi acayip sozler) uzerine kurulu oldugu icin signal objelerini class seviyesinde istiyormus: python 3.x - PyQt5 - Signal : pyqtSignal no method connect - Stack Overflow

Bu durumda tek bir sinyal kullanip hotkey’i vs. parametre olarak gondermek daha mantikli duruyor.

(to) bind. Sahsen Turkce’de “bind etmek” veya “baglamak” seklinde kullaniyorum. Connect ile esanlamli aslinda, veya biraz daha siki bir baglanti.

Burada tek bir sinyal butun callback’lere baglanmiyor mu? Nasil calisiyor?

Hayır hocam for döngüsü ile hotkey sınıflarına erişiyorum bu hotkey sınfındaki sinyali yine bu hotkey sınıfındaki callbacke bağlıyorum soneada bir sonraki sınıfa geçiyor.

Denemedim ama tahmini bir yaklaşımda bulunacağım:

python - PyQt4.QtCore.pyqtSignal object has no attribute ‘connect’ - Stack Overflow

out of your constructor but inside your class declaration.

hotkeyler thread gibi davranıyorsa böyle bir sorun yaşıyor olabilirsiniz.

Söylediğim gibi kodu denemedim. Sadece tahmin. Gelen key sözlük dışı kalıyorsa belki onları ayrıca filtrelemek de gerekebilir.

Dökümantasyonunda hata veya farklı değer döndürme durumlarını kontrol etmek gerekebilir.

Tabi şu kısımında göz önünde bulundurun:

This might not be at all what you are looking for, but it worked for me. I switched back to old-style signals anyways because I haven’t found a way in new-style signals to have an undefined number or type of parameters.

Yeni stil signal ve eski stil signal ler tanımlanmamış numaralar da döndürebiliyor muş.

Bunların hepsi şu an teori. Kodu denemeden bu kadar oldu. Kusuruma bakma artık.

Bir sonraki sinif ornegine (instance) geciyor, evet, ama butun ornekler siniftaki tek sinyali kullanmiyor mu?

Hiç iki hotkey deneme fırsatım olmadı belki haklısınızdır şuanda deneyemen yarın akşam deneyip mesaj atarım. Ama aynı sınıfın kopyalarındaki aynı sinyal olduğu için tek sinyale bağlancağını düşünmüyorum.