Skip to content Skip to sidebar Skip to footer

Python, Reference Class Instance/method In Decorated Function

I'm having a hard time finding a way to reference class instances in a decorator function. import json import time import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import

Solution 1:

No, You can not. Instead of using the @RTMClient.run_on() decorator, use the RTMClient.on() function to register it.

import threading
import asyncio

from slack import RTMClient

from PyQt5 import QtCore, QtWidgets


classSlackClient(QtCore.QObject):
    textChanged = QtCore.pyqtSignal(str)

    defstart(self):
        RTMClient.on(event="message", callback=self.say_hello)
        threading.Thread(target=self._start_loop, daemon=True).start()

    def_start_loop(self):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        slack_token = "xoxb-...."
        rtm_client = RTMClient(token=slack_token)
        rtm_client.start()

    defsay_hello(self, **payload):
        data = payload["data"]
        if data:
            if"text"in data:
                text = data["text"]
                self.textChanged.emit(text)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)

    client = SlackClient()

    button = QtWidgets.QPushButton("Start")
    textedit = QtWidgets.QPlainTextEdit()

    button.clicked.connect(client.start)
    client.textChanged.connect(textedit.appendPlainText)

    w = QtWidgets.QWidget()
    lay = QtWidgets.QVBoxLayout(w)
    lay.addWidget(button)
    lay.addWidget(textedit)
    w.show()

    sys.exit(app.exec_())

Update:

import sys
import threading
import asyncio

from slack import RTMClient

from PyQt5 import QtCore, QtWidgets
from main_UI import Ui_ApplicationWindow


classSlackClient(QtCore.QObject):
    textChanged = QtCore.pyqtSignal(str)

    defstart(self):
        RTMClient.on(event="message", callback=self.say_hello)
        threading.Thread(target=self._start_loop, daemon=True).start()

    def_start_loop(self):
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        slack_token = "xoxb-...."
        rtm_client = RTMClient(token=slack_token)
        rtm_client.start()

    defsay_hello(self, **payload):
        data = payload["data"]
        if data:
            if"text"in data:
                text = data["text"]
                self.textChanged.emit(text)


classApplicationWindow(QtWidgets.QMainWindow):
    def__init__(self):
        super(ApplicationWindow, self).__init__()
        self.ui = Ui_ApplicationWindow()
        self.ui.setupUi(self)

        self.client = SlackClient()
        # connections
        self.ui.pushButton.clicked.connect(self.client.start)
        self.client.textChanged.connect(self.ui.label.setText)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myWindow = ApplicationWindow()
    myWindow.show()
    sys.exit(app.exec_())

Solution 2:

Actually you cannot self since that is a global variable, not a class one.

from slack import RTMClient

classWorkerThread(QThread):
    finished = pyqtSignal(dict)

    def__init__(self):
        QThread.__init__(self)
        self.rtm_client = RTMClient(token="xoxp-....")    

    defrun(self):
        self.rtm_client.start()

    @RTMClient.run_on(event="message")defsay_hello(**payload):
        data = payload['data']
        if (len(data) != 0):
            if"text"in data:          
                text = data['text']                      
                WorkerThread.finished.emit(text)  <--- using self impossible 

I suggest that you make such variable private by appending two underscores at the beginning (__my_private_var)

Post a Comment for "Python, Reference Class Instance/method In Decorated Function"