类型错误:* 之后的 <lambda>() 参数必须是可迭代的,而不是队列

Pra*_*ash 0 python multithreading tkinter

我正在前端工作,需要在单击按钮时将手形光标更改为忙碌光标。但我的代码抛出“类型错误”。我只想让代码显示一个按钮,单击该按钮会从手形光标更改为繁忙光标,然后返回正常光标。

这是我迄今为止尝试过的代码:

import threading
from threading import Thread
from threading import Event
import queue

sem=threading.Semaphore()

def setup_for_long_running_task(self):
    print("start")
    self.f1.config(cursor="wait")  # Set the cursor to busy
    sem.acquire()

    return_que = queue.Queue(1)
    workThread = Thread(target=lambda q, w_self: \
                        q.put(self.long_running_task()),
                        args=return_que)
    workThread.start()

    self.f1.after(5000,use_results_of_long_running_task(self,workThread,return_que))  # 500ms is half a second
    sem.release()
    print("stop")

def long_running_task(self):

    Event().wait(3.0)  # Simulate long running task

def use_results_of_long_running_task(self, workThread,return_que):
    ThreadRunning = 1
    while ThreadRunning:
        Event().wait(0.1)  # this is set to .1 seconds. Adjust for your process
        ThreadRunning = workThread.is_alive()

    while not return_que.empty():
        return_list = return_que.get()

    self.f1.config(cursor="")  
Run Code Online (Sandbox Code Playgroud)

错误信息:

    TypeError: <lambda>() argument after * must be an iterable, not Queue. 

    Exception in thread Thread-7:
    Traceback (most recent call last):
    File "C:\ProgramData\Anaconda3\lib\threading.py", line 917, in 
    _bootstrap_inner
    self.run()
    File "C:\ProgramData\Anaconda3\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
    TypeError: <lambda>() argument after * must be an iterable, not Queue
Run Code Online (Sandbox Code Playgroud)

fur*_*ras 7

线程需要args元组或列表(可迭代对象),即使只有一个参数

 args=(return_que,)  # here is comma `,` to create tuple
Run Code Online (Sandbox Code Playgroud)

lambda需要两个参数lambda q, w_self:,但你只有一个元素args

 args=(return_que, ???)
Run Code Online (Sandbox Code Playgroud)

但我不知道你想用什么作为w_self