python tkinter:在单击按钮时调用对象方法不起作用

python tkinter: Calling a objects method on button click does not work

这是我的示例代码:

from time import  sleep
import tkinter as tk
import threading


class Action:

    counter = 0

    def do_something(self):
        while True:
            print('Looping')
            sleep(5)


action = Action()
root = tk.Tk()

button = tk.Button(root, text='pressme harder', command=threading.Thread(target=action.do_something()).start())
button.grid(row=1, column=0)

root.mainloop()

我在期待什么? 我希望一旦我单击 UI 中的按钮,就会有一个新线程 运行,它在后台循环并且不会干扰 UI(或者稍后可能其他线程在后台执行任务)

到底发生了什么? 当运行代码时,class的方法立即执行并锁定程序。 root.mainloop() 从未达到,因此没有绘制 UI

或者我尝试了以下更改:

button = tk.Button(root, text='pressme harder', command=threading.Thread(target=lambda: action.do_something()).start())

这表现为以下(恕我直言,错误)方式: 该方法也会立即调用,无需按下按钮。这次画了UI但是好像被线程锁住了(UI是slow/stuttering,大多数时候按下按钮不起作用)

知道哪里出了问题吗?或者我该如何以更稳定的方式处理这个问题?

您不应尝试直接在按钮命令中启动线程。我建议您创建另一个启动线程的函数。

from time import sleep
import tkinter as tk
import threading


class Action:
    counter = 0
    def do_something(self):
        while True:
            print('Looping')
            sleep(2)
            print("Finished looping")
            
    def start_thread(self):
        thread = threading.Thread(target=self.do_something, daemon=True)
        thread.start()


action = Action()
root = tk.Tk()

button = tk.Button(root, text='pressme harder', command=action.start_thread)
button.grid(row=1, column=0)

root.mainloop()