执行命令时禁用Tkinter按钮

时间:2014-10-28 05:45:11

标签: python button tkinter

我想在执行命令时禁用tk inter按钮,并在命令执行完成后启用它。我试过这段代码,但似乎没有用。

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

命令执行运行良好,但每次在执行命令时单击按钮,' test' Run函数完成后立即出现在控制台中。这意味着在执行运行功能时不会禁用该按钮。有什么建议可以解决这个问题吗?

提前致谢

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

你需要

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

更新按钮并将执行传递回Tkinter。