【问题标题】:How to run multiple threads in tkinter如何在 tkinter 中运行多个线程
【发布时间】:2021-01-02 03:30:28
【问题描述】:

假设我们这样写:

import threading
Button(root, command=threading.Thread(target=func1).start)

现在如果我们单击按钮一次就可以了,但我们尝试再次单击按钮然后出现错误“线程只能执行一次”强>.

那么,如何避免这种情况

【问题讨论】:

  • 改用lambdacommand=lambda: threading.Thread(...).start()
  • 如果我使用此代码,按钮甚至不会触发命令
  • 请注意,使用lambda时应为start()
  • 我对使用lambda 的建议应该可行,请参阅我的回答中的示例。

标签: python multithreading tkinter


【解决方案1】:

编辑答案:: 正如您在 cmets 中阐明的那样,您可以在每次单击 Button 时重新定义它,允许它接受多次单击,从而根据需要创建多个 threads。 您可以在 threading.Thread 对象的目标 func1()callback 函数中执行此操作。

一个工作的例子是这样的:

import tkinter as tk
import threading

def func1():
    theButton.configure(command=threading.Thread(target=func1).start)
    print('Do everything else here')

root = tk.Tk()
theButton = tk.Button(root, text='Start', command=threading.Thread(target=func1).start)
theButton.pack()
root.mainloop()

编辑:感谢 CoolCloud 提出了一种更好的方法来配置回调 func1() 内的按钮。

【讨论】:

  • 这实际上是否允许用户实际执行该函数两次?
  • 我不希望那个按钮被禁用。我希望用户可以多次单击该按钮。
  • @CoolCloud 不知何故,我没有注意到 OP 在第一次标题中的要求:| (有时我确实很疯狂 xD)但感谢您指出这一点。
  • 嗯,更简单的方法theButton.config(command=threading.Thread(target=func1).start) 也摆脱了grid(..)
  • @CoolCloud 哦,是的。编辑以反映相同。
【解决方案2】:

这是因为您创建了一个threading.Thread() 实例并将其start 方法传递给按钮的command 选项。每当单击按钮时,您都应该使用lambda 创建新实例:

import tkinter as tk
import threading

root = tk.Tk()

def func1():
    print('Hello')

tk.Button(root, text='Go', command=lambda: threading.Thread(target=func1).start()).pack()

root.mainloop()

【讨论】:

  • 如果我使用的是 lambda,那么我什至无法点击按钮
猜你喜欢
  • 2021-10-24
  • 2013-07-09
  • 1970-01-01
  • 2021-04-12
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
相关资源
最近更新 更多