Как удалить кнопку в Tkinter, пока функция, вызываемая по нажатию на нее, все еще выполняется? - PullRequest
1 голос
/ 02 мая 2020

Я использовал tkinter для создания кнопки и назначил ей функцию с помощью параметра command. Но эта функция содержит некоторый код, который требует времени для выполнения. Я смоделировал это здесь, используя time.sleep(). Я хочу удалить эту кнопку, когда эта кнопка нажата. Для этого я вызвал глобальную переменную для кнопки внутри функции, а затем использовал pack_forget().

from tkinter import *
import time


def signIn():
    global login_button
    login_button.pack_forget()
    # code after this takes some time to run.
    time.sleep(10)


login_screen = Tk()
login_button = Button(login_screen, text="Login", width=10, height=1, command=signIn)
login_button.pack()
login_screen.mainloop() 

Но проблема в том, что кнопка удаляется только после завершения выполнения функции (т.е. через 10 секунд). Можно ли как-нибудь удалить кнопку, как только строка pack_forget() будет выполнена, и не ждать завершения полной функции?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вызов update_idletasks метод окна login_screen после удаления кнопки.

Из effbot :

update_idletasks ()

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

def signIn():
    global login_button, login_screen
    login_button.pack_forget()
    login_screen.update_idletasks()
    # code after this takes some time to run.
    time.sleep(10)
0 голосов
/ 03 мая 2020

Использование update() работает:

def signIn():
    global login_button, login_screen
    login_button.pack_forget()
    login_screen.update()
    # code after this takes some time to run.
    time.sleep(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...