2014-10-28 32 views
0

我想在执行命令时禁用tk inter按钮,并在命令执行完成后将其启用。我试过这个代码,但它似乎不工作。在执行命令时禁用Tkinter按钮

from Tkinter import * 
import time 

top = Tk() 
def Run(object): 
    object.config(state = 'disabled') 
    print 'test' 
    time.sleep(5) 
    object.config(state = 'normal') 

b1 = Button(top, text = 'RUN', command = lambda : Run(b1)) 
b1.pack() 

top.mainloop() 

命令执行运行良好,但每次我点击按钮被执行命令时,“测试”出现在控制台后立即运行功能完成。这意味着在运行功能执行时按钮不会被禁用。任何建议来解决这个问题?

在此先感谢

+0

使用'sleep'作为你真正想做的事情的占位符是一个糟糕的选择。 “睡眠”会导致整个gui结冰。你到底在做什么?一个长计算?长数据库查询? – 2014-10-29 22:34:40

回答

-1

你需要

object.config(state = 'disabled') 
b1.update() 
time.sleep(5) 
object.config(state = 'normal') 
b1.update() 

更新按钮,并通过执行回Tkinter的。

+0

感谢您的回复。您的代码仅用于禁用按钮。但是我仍然可以点击按钮(当它被禁用时),并且只要上一个命令结束,命令就会被执行。这就像将命令回调放入队列并在上一个命令完成后运行它。我也不知道为什么。实际上,我设法使用python多线程来实现它。我使用两个线程,一个用于禁用按钮,另一个用于运行命令。但我仍然期待更简单的解决方案。 – ferryard 2014-10-28 07:43:08

+0

两个线程听起来不错。一个为任务。主循环应启用和禁用按钮。 – User 2014-10-28 07:55:55

+0

实际上,有时候线程会导致一个问题,使得python程序没有响应这样的错误信息:TclError:bad state“:0.0”:必须是活动的,禁用的或者正常的 – ferryard 2014-10-30 03:09:23

1

我更喜欢使用Tkinter的“after”方法,所以在5秒钟倒计时可以做其他事情。在这种情况下,这只是退出按钮。

from Tkinter import * 
##import time 
from functools import partial 

top = Tk() 

def Run(object): 
    if object["state"] == "active": 
     object["state"] = "disabled" 
     object.after(5000, partial(Run, object)) 
    else: 
     object["state"] = "active" 
    print object["state"] 

b1 = Button(top, text = 'RUN') 
b1.pack() 
## pass b1 to function after it has been created 
b1["command"] = partial(Run, b1) 
b1["state"]="active" 

Button(top, text="Quit", command=top.quit).pack() 

top.mainloop() 
+0

但是,我想完全禁用这些按钮,以便在运行过程尚未完成时不会发生任何进程。例如,如果按钮将显示一个窗口。如果我使用你的代码,我可以显示一个我不想发生的多窗口 – ferryard 2014-10-30 02:43:11

1

使用pack_forget()禁用pack()以重新启用。这导致“包装”窗口管理器暂时“忘记”它有一个按钮,直到你再次呼叫包。

from Tkinter import * 
import time 

top = Tk() 
def Run(object): 
    object.pack_forget() 
    print 'test' 
    time.sleep(5) 
    object.pack() 

b1 = Button(top, text = 'RUN', command = lambda : Run(b1)) 
b1.pack() 

top.mainloop()