如何在Tkinter中触发命令中的按钮更改?

时间:2019-05-19 13:22:01

标签: python python-3.x user-interface tkinter tk

我是TKinter的新手。我需要在单击button及其state时更改其文本,然后执行一些操作,最后再次更改其文本和状态。

问题在于更改仅在功能结束后才应用,从而跳过状态和文本的第一个更改。永远不会将Buttons文本更改为“正在加载”,并且永远不会禁用该按钮。

这是我遇到的问题的代码:

#!/usr/bin/env python
import tkinter as tk
import time


class Application(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.pack(fill=tk.BOTH, expand=1)
        self.create_widgets()

    def create_widgets(self):
        self.master.title("CW POS")

        cierre = tk.Button(
            self.master,
            command=self.re_imprimir_ultimo_cierre)

        cierre["text"] = "foo"
        cierre.pack(fill=tk.BOTH, expand=1)
        self._cierre = cierre

        salir = tk.Button(self.master, text="quit", command=self.salir)
        salir.pack(fill=tk.BOTH, expand=1)


    def salir(self):
        exit()

    def re_imprimir_ultimo_cierre(self):
        self._cierre["text"] = "Loading..."
        self._cierre["state"] = tk.DISABLED

        # TODO: magic
        time.sleep(2)

        self._cierre["text"] = "foo"
        self._cierre["state"] = tk.NORMAL



root = tk.Tk()
root.geometry("240x180")
root.resizable(False, False)
app = Application(root)
root.mainloop()

在按钮进行计算时,如何使按钮分别显示text="loading"state=DISABLED

1 个答案:

答案 0 :(得分:1)

此问题有一个非常快速的解决方法,只需将按钮的文本更改为“正在加载”("222" : 2-1 = 1),就只需更新按钮即可。

self._cierre["text"] = "Loading..."

这只是在更改文本和状态后仅更新按钮状态。

  

据我了解,这是因为在更新屏幕上的任何内容之前,按钮将运行其命令中的所有代码,因此从本质上讲您必须强制按钮在其命令中进行自身更新。

希望这会有所帮助:)