我正在编写一个程序,该程序搜索指定的图像,如果它找到了该图像,那么它就会按照用户对程序说的去做。我在线程方面遇到了问题。我想不止一次地使用多线程,所以我编写了一个线程装饰器。我在两个不同的功能上使用它。第一个函数没有任何问题。但是我得到了第二个函数的TypeError。这是我的代码:
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from threading import Thread
from pynput.keyboard import Listener
from keyboard import is_pressed as pressed
from keyboard import press
from tkinter.messagebox import showinfo
from tkinter.messagebox import showerror
from tkinter.messagebox import showwarning
from tkinter.messagebox import askyesno
from python_imagesearch.imagesearch import imagesearch as search
from functools import cache
from GUI import *
import time
import os
import sys
import pyautogui as pyg
import playsound
class ImageSearch(QtWidgets.QWidget):
def thread(function):
def wrapper(*values, **kwvalues):
t1 = Thread(target=function, args=values, kwargs=kwvalues)
t1.start()
return wrapper
@thread
def Listen(self):
with Listener(on_press=self.onpress) as listener:
press(chr(92))
listener.join()
# It is the function that I am getting the error
@thread
def Start(self):
if self.ui.btnStartSearching.text() == "Search":
self.ui.btnStartSearching.setText("Stop")
self.ui.groupBox.setEnabled(False)
我得到的错误是:
self._target(*self._args, **self._kwargs)
TypeError: ImageSearch.Start() takes 1 positional argument but 2 were given
我做错了什么?
我刚刚找到了解决方案。我是这样称呼它的:
self.ui.btnStartSearching.clicked.connect(self.Start)
我试着使用"lambda"方法,它已经被解决了。我更改了上面的代码:
self.ui.btnStartSearching.clicked.connect(lambda: self.Start())
这就是我解决问题的方法。
@马蒂斯又找到了一个解决方案。我们需要将*args
添加到要调用的函数中。
像这样:
self.ui.btnStartSearching.clicked.connect(self.Start)
def Start(self, *args):
#code
当CCD_ 2被添加到函数时。它被解决了。