Tkinter 按钮在禁用和更新后仍然响应点击

2024-04-23

我希望按钮启动命令,然后在执行时禁用并在执行完成后再次启用。

当我单击该按钮时,它似乎被禁用并且命令被执行。但是,当我在禁用按钮时单击该按钮时,该命令会在第一次执行完成后第二次执行。

似乎在第二次单击后,该按钮确实被禁用了,因为我可以在禁用它时单击几次,并且只能重复一次。

import tkinter as tk
import time


class Button:
    def __init__(self, master):
        frame=tk.Frame(master)
        frame.pack()
        self.button1=tk.Button(frame, text="Ready",bg="green", fg="white", command=self.click)
        self.button1.pack()

    def click(self):
        self.button1.config(bg="red", text="Busy", state="disabled")
        self.button1.update()
        doSth()
        self.button1.config(bg="green", fg="white", text="Ready", state="normal")
        self.button1.update()


def doSth():
    time.sleep(3)
    print("done")


root = tk.Tk()
b = Button(root)
root.mainloop()

当您在该过程中单击该按钮时sleep,您将按钮单击排队以在下一个更新周期中进行处理。在此期间sleeptkinter 不更新。之后sleep,您可以在函数返回并处理单击之前将按钮更改回正常状态。由于按钮再次激活,click再次被调用。

您可以通过让 tkinter 更新来解决这个问题before您再次激活该按钮,这将消除任何排队的点击事件,而该按钮仍处于停用状态。

def click(self):
    self.button1.config(bg="red", text="Busy", state="disabled")
    self.button1.update()
    doSth()
    self.button1.update()
    self.button1.config(bg="green", fg="white", text="Ready", state="normal")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tkinter 按钮在禁用和更新后仍然响应点击 的相关文章

随机推荐

  • Windows 上的 PHP mail():没有错误,电子邮件未发送

    我目前正在尝试调试一个基于 Elgg 的网站 我没有开发它 我想直接从本地开发计算机 WinXP 发送电子邮件 我正在使用 Apache 2 2 11 和 PHP 5 3 0 运行 WAMP 经过一番搜索后 我遇到的最简单的解决方案是使用假
  • 分阶段加载 spring 上下文

    这是人们会问的奇怪问题之一 为什么 所以我将从我为什么要这样做开始 然后讨论这个问题 我想更好地控制 spring 上下文的加载方式 例如 我不想同时加载域和web api 这将使资源在其依赖项准备好之前可用 也可能我需要检查某些东西的状态
  • 禁用对特定主机的警报,同时对所有其他主机发出警报

    我有数百台主机向普罗米修斯服务器报告 我的每个主机有很多出口商 我希望能够列出我不希望收到警报的主机列表 我仍然需要对这些主机进行普罗米修斯监控 我尝试过匹配没有接收器的路线 这不起作用 我究竟做错了什么 或者说 我应该怎么做 我的路线规则
  • 为什么 pgAdmin 4 这么慢?

    postgreSQL 的 pgAdmin 4 GUI 非常慢 即使扩展服务器树或数据库树也需要花费太多时间 它们各自花费了近 30 秒的时间来展开 创建新数据库或表时它也会挂起 即使加载后 创建和保存新数据库也需要一分多钟的时间 几乎每次我
  • 回形针未保存,没有错误

    我被绊倒了 浏览了文档 教程等 但不确定我做错了什么 项目中的另一个模型是为 Paperclip 设置的 并且在测试时可以正常工作 它将附件文件信息保存和检索到数据库中 并将文件放入 public system 内的子文件夹中 我基本上将相
  • jQuery 剪贴板复制

    我需要剪贴板复制功能 即使我正在寻求帮助http plugins jquery com project copy http plugins jquery com project copy链接 但无法正常工作 li li
  • Spark:相当于数据帧中的 zipwithindex

    假设我有以下数据框 dummy data a 1 b 25 c 3 d 8 e 1 df sc parallelize dummy data toDF letter number 我想创建以下数据框 a 0 b 2 c 1 d 3 e 0
  • 从坐标中提取地址分量

    我正在尝试使用 R 进行反向地理编码 我首先使用了 ggmap 但无法让它与我的 API 密钥一起使用 现在我正在用 googleway 尝试 newframe c Front lat Front long Front lat Front
  • 共享苹果付费开发者帐户的选项?

    问题 这里正确的程序是什么 Do both the developer and account holder need paid Apple Developer accounts 正如在下面的上下文中所说 我的客户已经有一个 我还需要一个付
  • Kotlin 中 ArrayList() 和 mutableListOf() 之间的区别

    private val repositories mutableListOf
  • 在 ResourceDictionary 文件中使用 viewbox

    我有 ResourceFile1 xaml 文件 其内容
  • 在控制器中使用 Angular 的 $watch 是反模式吗?

    在我永无休止地追求以 正确的 角度方式做事的过程中 我阅读了很多有关如何让控制器观察角度服务中保存的模型变化的文章 一些网站 http www benlesh com 2013 08 angularjs watch digest and a
  • 如何在单页应用程序中实现 gmail 撰写窗口概念?

    我正在开发一个项目 用户可以更轻松地快速添加交易 我非常有兴趣做一些类似于 gmail 撰写弹出窗口在单页上所做的事情 我不知道如何实现这样的事情 请给我指导如何做这些事情 我有兴趣使用 AngularJS 构建它 P S 抱歉问了一个宽泛
  • 包 oracle.jdbc.driver 不存在

    以下代码出错 发生错误 1 import java sql public class DBConnect public static void main String a throws SQLException package oracle
  • 如何使用脚本。在 JADE 模板中

    我使用 JADE 模板使用 Express 框架创建了一个简单的节点应用程序 学习过程中一切都很顺利 直到我开始尝试运行一些客户端 js 但我不知道该怎么做 我需要在 app index js 中做一些事情来告诉节点它们吗 任何帮助将非常感
  • 从相关系数计算中删除异常值

    假设我们有两个数值向量x and y 之间的皮尔逊相关系数x and y是 谁 给的 坐标 x y 我怎样才能自动考虑仅一个子集x and y在计算中 比如90 最大化相关系数 If you really想要做到这一点 删除最大 绝对 残差
  • Boost 互斥范围锁

    我正在阅读 drdobbs com 上的 Boost Mutex 教程 并发现了这段代码 include
  • GNU gdb 如何显示源文件名和符号行

    当使用 GNU gdb 调试 c 进程时 list 命令将打印行但不告诉我文件名 设置断点可以显示我想要的所有行和文件信息 但我不想设置断点并且必须禁用或删除它 gdb b oyss funtion Breakpoint 13 at 0x8
  • 如何在 Google Chrome 扩展程序中创建侧边栏?

    我正在考虑在 Google Chrome 中创建一个侧边栏扩展 并读到有一个 API 调用 Google 禁用了它 那么也许有人知道如何创建并有例子吗 不幸的是 侧边栏 API 工作最近已停止 https bugs chromium org
  • Tkinter 按钮在禁用和更新后仍然响应点击

    我希望按钮启动命令 然后在执行时禁用并在执行完成后再次启用 当我单击该按钮时 它似乎被禁用并且命令被执行 但是 当我在禁用按钮时单击该按钮时 该命令会在第一次执行完成后第二次执行 似乎在第二次单击后 该按钮确实被禁用了 因为我可以在禁用它时