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()
这是我的示例代码:
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()