Home > Mobile >  How to have a window terminates as soon as the function finished executing
How to have a window terminates as soon as the function finished executing

Time:11-02

I created a graphical user interface that has a button binds to a function called speech_to_dictation(). This function records and transcribe audio to dictation. Right now, in order to run other following in the main(), I would have to close this window manually by clicking the "close (X)" button. Are there anyways to make that after the function speech_to_dictation() completes executing, the window is automatically closed/destroyed?

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

CodePudding user response:

use sys.exit()

Exit from Python. This is implemented by raising the SystemExit exception, so cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level.

when the prosses is finished just call this function like so: sys.exit()

don't forget to import sys first (It's built in)

CodePudding user response:

For your question, simply pass main_window to speech_to_dictation() and destroy main_window inside 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()
  • Related