我使用 TkInter 制作了一個 GUI。現在我試圖在按鍵后執行一個動作。但是,當我單擊按鈕兩次時,我不希望該操作執行兩次。相反,程式應該等到前一個動作完成后再開始等待下一次按鍵。即使命令處理程式回傳,我似乎也無法做到這一點"break"。請參閱下面的最小作業示例,如果您<Left>多次按下按鈕,代碼也會執行多次。我應該如何更改代碼以實作所需的性能?
import tkinter as tk
import time
class App(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self)
# Create handler
def event_handler(event):
print('One run for event', event)
time.sleep(1)
print('Done')
return "break"
# Button
self.button = tk.Button(
master=self,
text='Test',
command = event_handler
)
self.button.grid()
self.bind('<Left>', event_handler)
self.focus()
if __name__ == "__main__":
root = tk.Tk()
root.title("TestTool")
# Start application
app = App(root)
app.pack(fill="both", expand=True)
root.mainloop()
uj5u.com熱心網友回復:
當您執行 Your event_handlerwith 時time.sleep(1),您實際上是在阻止任何其他事件的執行。但是事件觸發器正在累積并一個接一個地執行,每個觸發器是如何event_handler開始和結束的。它創造了串行執行的效果event_handler。
您想要的是設定一些標志來指示您的事件狀態。return然后,您必須在 Your from之前處理所有累積的事件event_handler。這將導致所有事件立即執行return,因為標志設定為True:事件正在運行。
這是代碼片段:
import time
import tkinter as tk
class App(tk.Frame):
event_running = False
def __init__(self, parent):
tk.Frame.__init__(self)
# Create handler
def event_handler(event=None):
# Check if event is running
if self.event_running:
return False
# Lock event until it's finished
self.event_running = True
print('One run for event', event)
time.sleep(1)
print('Done')
# Update all pending events
self.update()
self.update_idletasks()
# Release event handler
self.event_running = False
return
# Button
self.button = tk.Button(
master=self,
text='Test',
command=event_handler
)
self.button.grid()
self.bind('<Left>', event_handler)
self.focus()
if __name__ == "__main__":
root = tk.Tk()
root.title("TestTool")
# Start application
app = App(root)
app.pack(fill="both", expand=True)
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441039.html
