Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python,在修饰函数中引用类实例/方法_Python_Python 3.x_Pyqt_Pyqt5_Python Decorators - Fatal编程技术网

Python,在修饰函数中引用类实例/方法

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)

我很难找到在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)   

  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的元素。因此,最好使用线程,在那里运行循环可以避免问题。