Последовательность должна быть

  1. показать первый кадр
  2. нажмите "продолжить"
  3. показать второй кадр
  4. подожди 5 секунд
  5. показать третий кадр

Поэтому я добавил .after () в кнопку продолжения, но если я добавил таймер, первый кадр будет ждать 5 секунд после нажатия «продолжить», а затем переключится на третий кадр, пропуская второй кадр. Но если я этого не сделаю, кнопка просто переключится на второй кадр.

from tkinter import *

app = Tk()

h= int(app.winfo_screenheight())
w= int(app.winfo_screenwidth())

firstframe= Frame(app,width= w,height=h)
firstframe.grid(row = 0, column = 0)

firstcanvas= Canvas(firstframe, width =w, height = h,bg='yellow')
firstcanvas.grid(row = 0, column = 0) 

firstcanvas.create_text(1000,500,text="WELCOME!!!",font=("Monttserat", 100))

secondframe= Frame(app,width= w,height=h)
secondframe.grid(row = 0, column = 0)

secondcanvas= Canvas(secondframe, width =w, height = h,bg='blue')
secondcanvas.grid(row = 0, column = 0) 

secondcanvas.create_text(1000,500,text="Please Wait",font=("Monttserat", 100))

thirdframe= Frame(app,width= w,height=h)
thirdframe.grid(row = 0, column = 0)

thirdcanvas= Canvas(thirdframe, width =w, height = h,bg='red')
thirdcanvas.grid(row = 0, column = 0) 

thirdcanvas.create_text(1000,500,text="You May Start",font=("Monttserat", 100))



def switch(frame):
    frame.tkraise()

    
def secondframetimer():
    switch(secondframe)
    app.after(5000, switch(thirdframe))  #just uncomment/ comment this line
    
    
buttoncontinue = Button(firstframe, highlightthickness=0, text="Continue", font= ("Monttserat", 35,"bold"), border=0,command=lambda: secondframetimer())
buttoncontinue.place(x=800,y=620,width=300,height =50)

def key_pressed(event):
    if event.char=='q' or event.char=='Q':
        print("key ",event.char)
        app.destroy()
        
app.attributes('-fullscreen', True)
app.bind('<Key>',key_pressed)
switch(firstframe)  
app.mainloop()
0
red 23 Июл 2020 в 11:32

1 ответ

Лучший ответ

Вы неправильно использовали after():

app.after(5000, switch(thirdframe))

Результат такой же, как:

switch(thirdframe)
app.after(5000, None)

app.after(5000, None) работает так же, как time.sleep(5), поэтому он блокирует основной цикл tkinter, чтобы обновить экран до 5 секунд позже.

Измените это на

app.after(5000, switch, thirdframe)
2
acw1668 23 Июл 2020 в 08:44