在下面的代码中立即执行方法后的 Tkinter

问题描述

声音应该在 self.scr.mainloop() 之后,但它立即发出声音。 TKinter after 方法立即执行,然后在执行后暂停 3 秒。

我做错了什么?文档说这个函数会在暂停时间之后被调用,但它实际上是在之前发生的。我想在 def __init__(self):

调用音频功能
    from tkinter import *
    from sqlite3 import *
    from tkinter import messageBox
    import pyttsx3
    import time
    engine = pyttsx3.init()
    voices = engine.getProperty('voices')
    engine.setProperty('voice',voices[1].id)

    admin_username1 = {"Prasham":"123456","Akshat":"0000"}
    costermer_password1 = {"user":"user"}

    class store:
        def __init__(self):
            try:
                self.scr.destroy()
                self.scr=Tk()      
                
            except:
                try:
                    self.scr=Tk()
                except:
                    pass
            
            self.scr.geometry("500x500+500+180")
            self.scr.title("Multipurpose Store")
            self.scr.maxsize("500","500")
            self.scr.minsize("500","500")
            frame1 = Frame(self.scr,borderwidth = 3)
            frame1.pack(pady = 155)
            Label(frame1,text = "Login AS",font = ("Roboto",24),background = "yellow").pack()
            b1 = Button(frame1,text = "Admin login",background = "yellow",command=lambda:self.Adminlogin())
            b1.pack(padx=25,pady =25,side = LEFT)
            b2 = Button(frame1,text = "Customer login",command=lambda:self.Userlogin())
            b2.pack(padx=20,side = LEFT)

            scr.after(3,self.audio)
            self.scr.mainloop()

        def audio(self):
            
            engine.say('Hello World')
            engine.runAndWait()


        def Adminlogin(self):
            self.scr.destroy()
            self.scr=Tk()  
            self.scr.geometry("500x500+500+180")
            self.scr.title("Multipurpose Store")
            self.scr.maxsize("500","500")
            Label(self.scr,text = "Login Confermation",24)).place(x=115,y=155)
            user = Label(self.scr,text = "Username : ",16))
            password = Label(self.scr,text = "Password : ",16))
            user.place(x = 125,y = 225)
            password.place(x = 125,y = 255 )
            uservalue = StringVar()
            passvalue = StringVar()
            
            global userentry
            global passentry

            userentry = Entry(self.scr,textvariable = uservalue)
            passentry = Entry(self.scr,textvariable = passvalue,show="*")
            userentry.place(x = 255,y =230)
            passentry.place(x = 255,y = 265)
            b3 = Button(self.scr,text = "Home",command=lambda:self.@R_502_3151@).place(x=430,y=0,height=20,width=70)
            b4 = Button(self.scr,text = "login",command=lambda:self.check1()).place(x=250,y=300,width=130)
            self.scr.mainloop()

        def Userlogin(self):
            self.scr.destroy()
            self.scr=Tk()  
            self.scr.geometry("500x500+500+180")
            self.scr.title("Multipurpose Store")
            self.scr.maxsize("500",y = 255 )
            uservalue1 = StringVar()
            passvalue1 = StringVar()

            global userentry
            global passentry
        
            userentry = Entry(self.scr,textvariable = uservalue1)
            passentry = Entry(self.scr,textvariable = passvalue1,width=70)
            b5 = Button(self.scr,command=lambda:self.check1()).place(x=265,width=100)
            b6 = Button(self.scr,text = "New User",command=lambda:self.newuser()).place(x=265,y=327,height=19,width=100)
            self.scr.mainloop()

        def check1(self):

            a = userentry.get()
            b = passentry.get()
            
            if a=="" or b=="":
                messageBox.showerror('ERROR','Empty Entry is not allowed')
            
            elif a in admin_username1: 
                if admin_username1[a]==b:
                    messageBox.showinfo('Login',"You have Successfully Log In\nWelcome " +a)
                    self.AdminloginGUI()
                else:
                    messageBox.showerror('ERROR','INVALID PASSWORD')
            
            elif a in costermer_password1:
                if costermer_password1[a]==b:
                    messageBox.showinfo('Login',"You have Successfully Log In\nWelcome " +a)
                    self.UserloginGUI()
                else:
                    messageBox.showerror('ERROR','INVALID PASSWORD')

            else:
                messageBox.showinfo('ERROR','You are Not Registered Yet')

        def AdminloginGUI(self):
            self.scr.destroy()
            self.scr=Tk()  
            self.scr.geometry("500x500+500+180")
            self.scr.title("Admin")
            self.scr.maxsize("500","500")
            b3 = Button(self.scr,width=70)

        def UserloginGUI(self):
            self.scr.destroy()
            self.scr=Tk()  
            self.scr.geometry("500x500+500+180")
            self.scr.title("User")
            self.scr.maxsize("500",width=70)

        def newuser(self):
            self.scr.destroy()
            self.scr=Tk()  
            self.scr.geometry("500x500+500+180")
            self.scr.title("New User")
            self.scr.maxsize("500",width=70)

    engine.runAndWait()
    store()

解决方法

应该是 self.scr.after(3000,self.audio) 而不是 scr.after(3,self.audio),因为延迟是以毫秒为单位的。

同时删除 engine.runAndWait() 之前的 store()