我有一个带有一组按钮的小gui,按下按钮时调用了几个功能,这需要大约30秒才能完成,所以Gui冻结了,在这里搜索了很多修复后,我找到了一条路做它似乎在大多数情况下工作正常,当我运行脚本它确实有效,但运行几分钟后它就停止工作
这是一个带有1个参数的简单函数,该参数是另一个函数的名称。
def prueba(fcn):
thread.start_new_thread (fcn,())
这是按钮的代码:
button = Tkinter.Button(self,text=u"Irrelevant text",command= lambda: prueba(functionName))
button.grid(column=0,row=3)
button = Tkinter.Button(self,text=u"Irrelevant text",command= lambda: prueba(functionName))
button.grid(column=0,row=4)
button = Tkinter.Button(self,text=u"Irrelevant text",command= lambda: prueba(functionName))
button.grid(column=0,row=5)
button = Tkinter.Button(self,text=u"Irrelevant text",command= lambda: prueba(functionName))
button.grid(column=1,row=3)
button = Tkinter.Button(self,text=u"Irrelevant text",command= lambda: prueba(functionName))
button.grid(column=1,row=4)
button = Tkinter.Button(self,text=u"Irrelevant text",command= lambda: prueba(functionName))
button.grid(column=1,row=5)
这是控制台在一段时间后点击按钮时显示的内容。
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1541, in __call__
return self.func(*args)
File "***", line 354, in <lambda>
button = Tkinter.Button(self,text=u"Irrelevant Text",command= lambda: prueba(functionName))
TypeError: 'bool' object is not callable
答案 0 :(得分:0)
文件&#34; ***&#34;,第354行,in button = Tkinter.Button(self,text = u&#34; Irrelevant Text&#34;,command = lambda:prueba(functionName)) TypeError:&#39; bool&#39;对象不可调用
首先,使用partial而不是lambda,因为它应该更容易理解
yearStart = 2010
yearEnd = 2017
monthStart = 1
monthEnd = 12
for year in list(range(yearStart, yearEnd + 1)):
for month in list(range(monthStart, monthEnd + 1)):
startDate = '%04d%02d%02d' % (year, month, 1)
numberOfDays = calendar.monthrange(year, month)[1]
lastDate = '%04d%02d%02d' % (year, month, numberOfDays)
然后使用after()代替Threading来安排它(非阻塞),虽然我们没有太多关于你正在做什么的信息,所以这是一个通常有用的解决方案。
from functools import partial
## create all buttons is of course the same as one button
button = Tkinter.Button(self,text=u"Irrelevant text",
command=partial(prueba, functionName))
button.grid(column=0,row=3)