2016-11-23 78 views
0

我有一个tkinter接口,带有两个按钮以触发我的应用程序的两种模式以及显示它处于哪种模式的标签。单击按钮时,生成的函数被称为需要一段时间来执行并回来。这导致我的鼠标光标在旋转,并且该按钮基本上被“冻结”,直到该功能完成其执行,然后我可以单击另一个按钮。tkinter按钮单击以启动线程以防止GUI冻结

我想要的行为是,我单击一个按钮,它异步运行函数(新线程),并使按钮再次可点击。如果单击另一个按钮,则立即停止该第一个线程,并且新的函数/线程异步启动。

我该如何去做到这一点?

def alert_mode(var): 
    print("Entering Alert Mode") 
    var.set("Current mode: Alert") 
    // do stuff that takes a while to return 

def capture_mode(var): 
    print("Entering Capture Mode") 
    var.set("Current mode: Capture") 
    // do stuff that takes a while to return 

root = tk.Tk() 
root.geometry('400x400') 
var = StringVar() 
var.set("Current mode: Alert") 
text = tk.Label(root, text="Current mode: Alert", textvariable=var, fg="blue", font=("Arial", 18)) 
text.pack(pady=8) 
b = tk.Button(root, text="Alert mode", height=10, width=15, font=("Arial",14), command=lambda: alert_mode(var)) 
b.pack() 
b2 = tk.Button(root, text="Capture mode", height=10, width=15, font=("Arial",14), command=lambda: capture_mode(var)) 
b2.pack() 

root.mainloop() 

编辑:

好,这里是更新的代码。我试图弄清楚如何启动和停止一个线程,但这并不像我想要的那样工作。我其实不希望这两个线程一次运行。它是警报模式或捕捉模式。重点是我不希望GUI在任何模式运行时都冻结,以便用户可以随时切换到其他模式。

def alert_mode(var): 
    print("Entering Alert Mode") 
    var.set("Current mode: Alert") 
    // do stuff that takes a while to return 

def capture_mode(var): 
    print("Entering Capture Mode") 
    var.set("Current mode: Capture") 
    // do stuff that takes a while to return 

def start_alert_thread(var): 
    t = threading.Thread(target=alert_mode, args=(var,)) 
    t.start() 
    t.join() 

def start_capture_thread(var): 
    t2 = threading.Thread(target=alert_mode, args=(var,)) 
    t2.start() 
    t2.join() 

root = tk.Tk() 
var = StringVar() 
var.set("Current mode: Alert") 
text = tk.Label(root, text="Current mode: Alert", textvariable=var, fg="blue", font=("Arial", 18)) 
text.pack(pady=8) 
b = tk.Button(root, text="Alert mode", height=10, width=15, font=("Arial",14), command=lambda: start_alert_thread(var)) 
b.pack() 
b2 = tk.Button(root, text="Capture mode", height=10, width=15, font=("Arial",14), command=lambda: start_capture_thread(var)) 
b2.pack() 

root.mainloop() 

回答

1

使用线程,

import threading 
option = 0 

def buttonOne(): 
    global option 
    if option == 2: 
     "kill statement (not sure what)" 
     option = 1 
    else: 
     option = 1 

def buttonTwo(): 
    global option 
    if option == 1: 
     "kill statement (not sure what)" 
     option = 2 
    else: 
     option = 2 

有按钮来运行这样的功能。

def threadButtonOne(): 
    threading.Thread(target=buttonOne).start() 
+0

这就是我对杀戮的线程中发现,[链接1](http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread- in-python),[link 2](http://stackoverflow.com/questions/15729498/how-to-start-and-stop-thread) –