【问题标题】:Tkinter Buttons and threadingTkinter 按钮和线程
【发布时间】:2018-08-15 22:29:16
【问题描述】:

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

【问题讨论】:

  • 请提供一个可测试的例子。可以复制并按原样运行的东西会得到相同的错误。
  • 请提供minimal reproducible example。这将帮助您理解问题,在您完全理解问题之前,您很难向我们描述问题。

标签: multithreading python-2.7 selenium button tkinter


【解决方案1】:

文件“***”,第 354 行,在 button = Tkinter.Button(self,text=u"无关文本",command= lambda: prueba(functionName)) TypeError: 'bool' 对象不可调用

首先,使用 partial 代替 lambda,这样应该更容易理解

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)

然后使用 after() 而不是 Threading 来安排它(非阻塞),尽管我们没有太多关于你在做什么的信息,所以这是一个通常有效的解决方案。

def prueba(func_name):
    ## 100=one tenth of a second
    main.after(100, func_name, ())  ## () sends empty tuple to func_name???

【讨论】:

  • 我以为我不能使用 after() ,因为我想在实际单击按钮时调用该函数。我要做的是,用 selenium 打开一个 webbrowser 并在一个网站上测试几个东西,然后函数调用 driver.quit 来关闭那个浏览器,然后,gui 重新开始工作,冻结是我打算用线程修复的.
  • Lambda 简单易懂。当您可以使用 lambda 代替时,我不认为导入其他东西来解决问题是最佳选择。
  • 我以为我不能使用 after() ,因为我想在实际单击按钮时调用该函数 您可以设置 after 为您想要的任何等待时间。使用 after(1. ...) 等待 1/1000 秒,实际上与按下按钮时相同。
  • 当你可以使用 lambda 时,我不认为导入其他东西来解决问题是最好的选择问题是 OP 从 lambda 中得到一个错误声明,这是有人提出部分的原因之一。如果您不想导入,那么您将在 Python 中丢失很多非常好的东西。另外,请注意 lambda 也是作为标准库的一部分导入的。
  • 但我不希望自动调用该函数,我想在我实际按下按钮时调用该函数,除非有我缺少的东西。
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2014-12-29
  • 2014-07-30
相关资源
最近更新 更多