早上好,
我的目標是:
- 我想創建一個按鈕,單擊該按鈕會觸發回呼函式(即使該函式仍在運行)。
模塊:
- 我正在使用 tkinter
問題:
- 當我觸發按鈕時,函式運行,但在函式完成運行之前我無法再次按下按鈕。我希望能夠在功能仍在運行時按下按鈕,并讓功能停止并從頭開始再次運行。
我的嘗試:
- 我嘗試了程式和 OOP 方法:兩者都存在相同的問題
我的嘗試 n1:程式方法
import time
import tkinter as tk # Import tkinter
from tkinter import ttk # Import ttk
def func():
for i in range (100):
print(i)
time.sleep(5)
win = tk.Tk() # Create instance of the Tk class
aButton = ttk.Button(win, text="Click Me!", command=func)
aButton.grid(column=0, row=0) # Adding a Button
win.mainloop() # Start GUI
我的嘗試 n2:OOP 方法
import time
import tkinter as tk # Import tkinter
from tkinter import ttk # Import ttk
class OOP():
def func(self):
for i in range (100):
print(i)
time.sleep(5)
def __init__(self):
win = tk.Tk() # Create instance of the Tk class
aButton = ttk.Button(win, text="Click Me!", command=self.func)
aButton.grid(column=0, row=0) # Adding a Button
win.mainloop() # Start GUI
oop = OOP()
謝謝
uj5u.com熱心網友回復:
在 tkinter 中,與大多數 GUI 框架一樣,有一個for回圈在某處運行,不斷檢查用戶輸入。您正在劫持該回圈來進行func處理。Tkinter 不能檢查用戶輸入,也不能改變按鈕圖示的外觀,因為只有一個執行緒并且你正在使用它。
您要做的是啟動一個執行緒或行程來完成這項作業。如果您有很多后臺任務,有很多庫可以以精細的方式進行并行處理,但這適用于單個功能(另請參見此答案)。
import time
import tkinter as tk # Import tkinter
from tkinter import ttk # Import ttk
import threading
def button():
thread = threading.Thread(target=func, args=args)
thread.start()
def func():
for i in range (100):
print(i)
time.sleep(5)
win = tk.Tk() # Create instance of the Tk class
aButton = ttk.Button(win, text="Click Me!", command=button)
aButton.grid(column=0, row=0) # Adding a Button
win.mainloop() # Start GUI
如果行程長時間運行,您可能需要找到一種方法在執行緒完成后清理它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511676.html
