我想在执行命令时禁用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函数完成后立即出现在控制台中。这意味着在执行运行功能时不会禁用该按钮。有什么建议可以解决这个问题吗?
提前致谢
答案 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。