【问题标题】:Problem with binding 2 functions to a button in tkinter将 2 个函数绑定到 tkinter 中的按钮的问题
【发布时间】:2021-08-19 19:11:58
【问题描述】:

首先这是我的代码:

button_1 = Button(
        image=button_image_1,
        borderwidth=0,
        highlightthickness=0,
        command=lambda:[get_to_main_when_clicked(),delete_red_border()],
        relief="flat"
    )

如您所见,我将 2 个功能绑定到此按钮。对于第一个:如果特定条件为真,则该函数让图像出现。然后第二个应该等待 3 秒并且应该删除出现的图像。唯一真正奇怪的问题是,无论我做什么,首先执行 delete_red_border() 函数。它等待 3 秒,然后尝试删除无法定义和全球化的图像,因为 get_to_main_when_clicked() 函数未执行。我该如何解决这个问题? PS:具体条件为真。

【问题讨论】:

  • 也许不是在命令中同时添加这两个函数,只需添加get_to_main_when_clicked()函数,在get_to_main_when_clicked()末尾可以使用after(3000, delete_red_border)
  • 您的lambda 创建一个列表,首先评估第一项。我想问题出在其他地方......
  • 是的,我想我找到了问题,我在另一个答案下的评论中描述了它,但是是的,BrianZhang 你完全正确,非常明显并且更简单的解决方案。非常感谢!
  • 该死的也不行,我猜是因为同样的问题
  • 在函数运行完成之前窗口不会刷新

标签: python tkinter tkinter-canvas


【解决方案1】:

不要这样做。专门为此按钮创建一个函数。函数比 lambda 更容易理解和调试,尤其是复杂的 lambda。然后,您可以将任何您想要的逻辑放入函数中。

def do_something():
    get_to_main_when_clicked()
    delete_red_border()

button_1 = Button(..., command=do_something)

【讨论】:

  • 我已经尝试过了,但我想我现在知道错误是什么了。似乎第一个函数正在执行,但是只有在绑定到按钮的所有函数都完成执行后,窗口才会刷新。我能以某种方式绕过这个吗?
【解决方案2】:

我找到了解决方案。问题是,完成第一个功能后它没有刷新/更新窗口。一行代码就解决了这个问题:

window.update()

【讨论】:

  • 是的,tkinter 是单线程的。当它运行一个函数时,它不能更新窗口。
  • 通常在不需要时调用 update() 不是一个好的约定。如果您的程序不是太大,您可以将其发布在您的问题中,我可以看看是否有更好的方法来做到这一点。通常,您总是希望使用 mainloop() 来更新您的程序。
猜你喜欢
  • 1970-01-01
  • 2020-08-18
  • 2020-04-08
  • 1970-01-01
  • 2016-09-01
  • 2021-06-04
  • 2018-11-11
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多