Tkinter按钮和线程

时间:2018-03-07 17:54:41

标签: multithreading python-2.7 selenium button tkinter

我有一个带有一组按钮的小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

1 个答案:

答案 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)