Как сделать так, чтобы окно закрывалось, как только функция завершала выполнение

#python #tkinter

Вопрос:

Я создал графический пользовательский интерфейс, в котором кнопка привязана к функции под названием speech_to_dictation(). Эта функция записывает и записывает аудио под диктовку. Прямо сейчас, чтобы запустить другие функции в main(), мне пришлось бы закрыть это окно вручную, нажав кнопку «закрыть (X)». Есть ли какие-либо способы сделать так, чтобы после завершения выполнения функции speech_to_dictation() окно автоматически закрывалось/уничтожалось?

 from tkinter import *
import SpeechToDictation as Std
import pyautogui
import time


def speech_to_dictation():
    speech_inst = Std.SpeechToDictation()
    dictation.append(speech_inst.read_audio())


def user_speech_to_dictation():
    main_window = Tk()
    button = Button(text='Recording')
    button.pack()
    # I want this main_window to be closed as soon as speech_to_dictation function finished executing
    button.config(command=speech_to_dictation)
    main_window.mainloop()


class Test(Frame):
    def __init__(self, parent=None, picks=[]):
        Frame.__init__(self, parent)
        self.vars = []
        self.checkboxes = []
        Label(self, text='Lab Works').grid(row=0, padx=10, pady=10)
        i = 1
        for pick in picks:
            var = IntVar()
            chk = Checkbutton(self, text=pick, variable=var)
            chk.grid(row=i, pady=4, padx=10)
            self.vars.append(var)
            self.checkboxes.append(chk)
            i  = 1

    def state(self):
        return map((lambda var: var.get()), self.vars)


def full_screen(window):
    width = window.winfo_screenwidth()
    height = window.winfo_screenheight()
    window.geometry("%dx%d" % (width, height))


def allstates():
    print(list(lng.state()))


def make_test(window):
    full_screen(window=root)
    window.grid(row=1, column=0)
    Button(root, text='Quit', command=root.quit).grid(row=10, padx=10, pady=10)
    Button(root, text='Peek', command=allstates).grid(row=12, padx=10, pady=10)


if __name__ == '__main__':
    # store dictation at dictation[]
    dictation = []
    user_speech_to_dictation()
    is_string_complete = dictation[0]['text'][:8]
    if is_string_complete == 'complete':
        start_time = time.time()  # returns number of seconds passed since epoch
        max_loop_time = 1  # 1 seconds

        while True:
            if (time.time() - start_time) >= max_loop_time:
                root = Tk()
                lng = Test(root, ['Blood Count', 'Lipid Panel', 'Hemoglobin A1C'])
                make_test(window=lng)
                root.state('zoomed')
                root.update()
                x_position, y_position = pyautogui.position()
                print(x_position, y_position)
                max_loop_time = time.time() - start_time   max_loop_time
                # Coordinate of each boxes: they seem wrong
                locations = [(53, 158), (84, 228), (36, 302)]
                blood_count_string = dictation[0]['text'][9:]
                if blood_count_string == 'blood count':
                    x_coordinate = locations[0][0]
                    y_coordinate = locations[0][1]
                    pyautogui.click(x_coordinate, y_coordinate)
                    allstates()
                root.destroy()

            # quit the program after the window is destroyed
            if max_loop_time > 2:
                break
 

Ответ №1:

Для вашего вопроса просто перейдите main_window speech_to_dictation() и уничтожьте main_window внутри speech_to_dictation() :

 def speech_to_dictation(win):
    speech_inst = Std.SpeechToDictation()
    dictation.append(speech_inst.read_audio())
    win.destroy() # destroy the window


def user_speech_to_dictation():
    main_window = Tk()
    button = Button(text='Recording')
    button.pack()
    # I want this main_window to be closed as soon as speech_to_dictation function finished executing
    button.config(command=lambda: speech_to_dictation(main_window))
    main_window.mainloop()
 

Комментарии:

1. Чтобы избежать вызова функции mainloop() более одного раза, как я могу добиться того, чтобы окно работало без вызова функции mainloop()?

2. Кроме того, если бы я вызвал только функцию Toplevel() , главное окно по-прежнему отображалось бы как пустое окно. Как мне удалось не показать главное окно?

3. @QuanKhuc Просто обратите внимание, что user_speech_to_dictation() это вызывается в раннем состоянии, и в это время не было создано окно tkinter, поэтому я обновил свой ответ.

4. Спасибо вам за ваш ответ. Ваш ответ вдохновил меня на то, чтобы на самом деле у меня был только один основной канал()

Ответ №2:

используйте sys.exit()

Выход из Python. Это реализуется путем создания исключения SystemExit, поэтому действия по очистке, указанные в предложениях finally операторов try, выполняются, и можно перехватить попытку выхода на внешнем уровне.

когда работа будет завершена, просто вызовите эту функцию следующим образом: sys.exit()

не забудьте import sys сначала (это встроено)

Комментарии:

1. это то же самое, что использовать exit() , так зачем вам беспокоиться об импорте sys и использовании sys.exit() ?