Python,在修饰函数中引用类实例/方法
我很难找到在decorator函数中引用类实例的方法Python,在修饰函数中引用类实例/方法,python,python-3.x,pyqt,pyqt5,python-decorators,Python,Python 3.x,Pyqt,Pyqt5,Python Decorators,我很难找到在decorator函数中引用类实例的方法 import json import time import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * from main_UI import Ui_ApplicationWindow from slack import RTMClient class WorkerThread(QThread): finished = pyqtSignal(str)
import json
import time
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from main_UI import Ui_ApplicationWindow
from slack import RTMClient
class WorkerThread(QThread):
finished = pyqtSignal(str)
def __init__(self):
QThread.__init__(self)
self.rtm_client = RTMClient(token="xoxp...")
def run(self):
self.rtm_client.start()
@RTMClient.run_on(event="message")
def say_hello(**payload):
data = payload['data']
if (len(data) != 0):
if "text" in data:
text = data['text']
self.finished.emit(str(text))
class ApplicationWindow(QMainWindow):
def __init__(self):
super(ApplicationWindow, self).__init__()
self.ui = Ui_ApplicationWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.start_rtm)
def start_rtm(self):
self.thread = WorkerThread()
self.thread.finished.connect(self.update)
self.thread.start()
@pyqtSlot(str)
def update(self, data):
self.ui.label.setText(data)
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = ApplicationWindow()
myWindow.show()
app.exec_()
因此,在say_hello
中,由于不能将self
作为参数,因此我无法在函数末尾使用self.finished.emit(text)
import json
import time
import sys
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from main_UI import Ui_ApplicationWindow
from slack import RTMClient
class WorkerThread(QThread):
finished = pyqtSignal(str)
def __init__(self):
QThread.__init__(self)
self.rtm_client = RTMClient(token="xoxp...")
def run(self):
self.rtm_client.start()
@RTMClient.run_on(event="message")
def say_hello(**payload):
data = payload['data']
if (len(data) != 0):
if "text" in data:
text = data['text']
self.finished.emit(str(text))
class ApplicationWindow(QMainWindow):
def __init__(self):
super(ApplicationWindow, self).__init__()
self.ui = Ui_ApplicationWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.start_rtm)
def start_rtm(self):
self.thread = WorkerThread()
self.thread.finished.connect(self.update)
self.thread.start()
@pyqtSlot(str)
def update(self, data):
self.ui.label.setText(data)
if __name__ == "__main__":
app = QApplication(sys.argv)
myWindow = ApplicationWindow()
myWindow.show()
app.exec_()
如何使用
say_hello
中的self
引用类实例/函数?实际上,您不能使用self,因为它是全局变量,而不是类变量
from slack import RTMClient
class WorkerThread(QThread):
finished = pyqtSignal(dict)
def __init__(self):
QThread.__init__(self)
self.rtm_client = RTMClient(token="xoxp-....")
def run(self):
self.rtm_client.start()
@RTMClient.run_on(event="message")
def say_hello(**payload):
data = payload['data']
if (len(data) != 0):
if "text" in data:
text = data['text']
WorkerThread.finished.emit(text) <--- using self impossible
从slack导入RTMClient
类WorkerThread(QThread):
完成=PYQT信号(dict)
定义初始化(自):
QThread.\uuuu init\uuuu(self)
self.rtm_client=RTMClient(token=“xoxp-…”)
def运行(自):
self.rtm_client.start()
@RTMClient.run_on(event=“message”)
def打招呼(**有效负载):
数据=有效载荷['data']
如果(len(数据)!=0):
如果数据中有“文本”:
text=数据['text']
WorkerThread.finished.emit(text)否,不能。不要使用decorator,而是使用函数来注册它
导入线程
导入异步
从slack导入RTMClient
从PyQt5导入QtCore、QtWidgets
类SlackClient(QtCore.QObject):
textChanged=QtCore.pyqtSignal(str)
def启动(自):
RTMClient.on(event=“message”,callback=self.say\u hello)
threading.Thread(target=self.\u start\u loop,daemon=True).start()
def_启动_循环(自):
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
slack_token=“xoxb-…”
rtm_客户端=RTMClient(令牌=slack_令牌)
rtm_client.start()
def打招呼(自我,**有效载荷):
数据=有效载荷[“数据”]
如果数据:
如果数据中有“文本”:
text=数据[“text”]
self.textChanged.emit(文本)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
client=SlackClient()
button=QtWidgets.QPushButton(“开始”)
textedit=qtwidts.QPlainTextEdit()
按钮。单击。连接(客户端。启动)
client.textChanged.connect(textexedit.appendPlainText)
w=qtwidts.QWidget()
lay=qtwidts.QVBoxLayout(w)
lay.addWidget(按钮)
lay.addWidget(文本编辑)
w、 show()
sys.exit(app.exec_())
更新:
导入系统
导入线程
导入异步
从slack导入RTMClient
从PyQt5导入QtCore、QtWidgets
从主UI导入UI应用程序窗口
类SlackClient(QtCore.QObject):
textChanged=QtCore.pyqtSignal(str)
def启动(自):
RTMClient.on(event=“message”,callback=self.say\u hello)
threading.Thread(target=self.\u start\u loop,daemon=True).start()
def_启动_循环(自):
loop=asyncio.new\u event\u loop()
asyncio.set\u event\u循环(循环)
slack_token=“xoxb-…”
rtm_客户端=RTMClient(令牌=slack_令牌)
rtm_client.start()
def打招呼(自我,**有效载荷):
数据=有效载荷[“数据”]
如果数据:
如果数据中有“文本”:
text=数据[“text”]
self.textChanged.emit(文本)
类ApplicationWindow(QtWidgets.QMainWindow):
定义初始化(自):
超级(应用程序窗口,自我)。\uuuu初始化
self.ui=ui\u ApplicationWindow()
self.ui.setupUi(self)
self.client=SlackClient()
#联系
self.ui.button.clicked.connect(self.client.start)
self.client.textChanged.connect(self.ui.label.setText)
如果名称=“\uuuuu main\uuuuuuuu”:
app=qtwidts.QApplication(sys.argv)
myWindow=ApplicationWindow()
myWindow.show()
sys.exit(app.exec_())
你好,所以\uu finished=pyqtSignal(dict)
?是。它起作用了吗?请确保更改say_hello
方法(WorkerThread.\uu finished.emit(text)
)中的调用。no无法将其设置为私有,因为finished
是从另一个类访问的,似乎这家伙有这个权限。但我不能应用它,你能帮我吗?好吧,那样的话,不要。把它公之于众有用吗?谢谢你的回答!我觉得这对我来说有点挑战性。我有一个独立运行的ApplicationWindow
类和一个WorkerThread
类。你能把你的概念应用到我的上下文中吗?我更新了我的代码…很好,它就像一个符咒!非常感谢。在我的例子中,我使用了class WorkerThread(QThread):
当我使用threading.Thread(target=self.\u start\u loop,daemon=True)。start()
在类中,我使用了两个线程吗?@bbusdriver Yes。不要使用QThread,它会给你带来一些不便。对不起,我是新手,为什么使用QThread会带来一些不便?因此,建议使用QObject并使用线程。线程
everytime?@bbusdriver在这种情况下,使用线程更容易。TL;博士线程不依赖于技术/库/语言,而是依赖于操作系统,因此线程处理的线程与QThread处理的线程相同,因此通常使用其中一个线程并不重要。但是QThread允许您将QObject移动到新的上下文中,如果您不知道如何处理它(因为您是初学者,所以我想您不知道),您可以从QObject不属于的线程中修改QObject的元素。因此,最好使用线程,在那里运行循环可以避免问题。