Python Unbound PyQt Signal'i bound yapma

makalidap

Decapat
Katılım
13 Nisan 2023
Mesajlar
124
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
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ış da düşünüyor olabilirim, belirtin yanlışsa). Bu yüzdende keyboard modülü ile yapmayı denedim ama direkt add_hotkey ile kısayol ekleyince yanıt vermiyor alıyordum add_hotkeyi pyqtsignale bağlayarak çözdüm. Kod bu şekildeydi:

Python:
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 Signal'i bir sözlükten çekmeye çalışınca Signal unbound'da kalıyor bound olmuyor. Onun için de:

AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
Böyle hata alıyorum. Kod böyle:

Python:
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 bound'a geçiririm? Bu yanıt vermiyor hatasının daha kolay/alternatif bir çözümü var mıdır, varsa nedir? Yardımcı olursanız sevinirim.

Python:
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.
 
Son düzenleyen: Moderatör:

Technopat Haberler

Geri
Yukarı