Как вызвать изменения в кнопке в команде в Tkinter? - PullRequest
1 голос
/ 19 мая 2019

Я новичок в 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 Ответ

1 голос
/ 19 мая 2019

Существует довольно быстрое решение этой проблемы, вам просто нужно обновить кнопку, как только вы измените ее текст на «Загрузка» (self._cierre["text"] = "Loading...")

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

        self._cierre.update() # This is the line I added

        # TODO: magic
        time.sleep(2)

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

Это просто обновляет состояние кнопок после изменения текста и состояния.

Из того, что я понимаю, это потому, что кнопка будет запускать весь код в своей команде, прежде чем обновлять что-либо на экране, поэтому вам, по сути, придется принудительно обновлять саму кнопку в своей команде.

Надеюсь, это поможет:)

...