Кнопка Tkinter по-прежнему реагирует на нажатия после отключения и обновления - PullRequest
2 голосов
/ 05 апреля 2019

Я хочу, чтобы кнопка запускала команду, затем была отключена во время выполнения и снова включена после завершения выполнения.

Когда я нажимаю кнопку, она кажется отключенной, и команда выполняется.Но когда я нажимаю кнопку, когда она отключена, команда выполняется второй раз после завершения первого выполнения.

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

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()

1 Ответ

2 голосов
/ 05 апреля 2019

Когда вы нажимаете кнопку во время sleep, вы ставите в очередь нажатие кнопки для обработки в следующем цикле обновления. Во время sleep tkinter не обновляется. После sleep вы вернете кнопку в нормальное состояние до того, как функция вернется и щелчок будет обработан. Поскольку кнопка снова активна, click вызывается снова.

Вы можете противостоять этому, позволив tkinter update до снова активировать кнопку, это избавит от любых событий щелчка в очереди, пока кнопка все еще деактивирована.

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...