tkinter按钮单击以启动线程以防止GUI冻结

时间:2016-11-23 05:03:42

标签: python tkinter

我有一个带有两个按钮的tkinter接口,用于触发我的应用程序的两种模式,以及一个标签,显示它所处的模式。单击一个按钮时,调用的结果函数需要一段时间才能执行并返回。这导致我的鼠标光标旋转,按钮基本上被冻结"直到函数完成执行才能点击另一个按钮。

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

我如何实现这一目标?

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()

2 个答案:

答案 0 :(得分:1)

使用线程,

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

让按钮运行这样的功能。

onStop

答案 1 :(得分:0)

我对于这种情况有出路: 条件:使用python和tkinter运行selenium webdriver。从句柄转到python程序的位置按下播放按钮后,tkinter GUI窗口将变为“无响应”模式。但是python程序继续 注意:indent-只是一个占位符,就像缩进在python中很重要 解: 导入线程,tkinter等 def python_main(): indent- input(“输入用户数”)#依此类推。 indent- def python_sub():#并完成具有多种功能的程序

tkwindow = tk.Tk()

def mid(): 缩进= threading.Thread(target = python_main) indentth.start()

def tkinter_func(): indent- button = tk.Button(tkwindow,text =“ press me”,border = 0,command = mid) indent- button.place(x = 4,y = 4)

tkwindow.mainloop() 说明:无需等待。没有自动运行程序。