2016-09-27 3 views
0

저는 첫 번째 응용 프로그램을 작성 중이며 tkinter 및 python으로 작동하는 GUI를 설정하는 방법에 대한 자습서를 따르고 있습니다. 내 응용 프로그램은 시작 화면 애니메이션을 재생하여 시작하고 완료되면 "UserSetup"프레임으로 전환합니다. 나는이 비디오를 재생하는 함수를 다시 코딩하려고 노력 중이다. 그래서 나는 그것을 (또는 어떤 동작이든) 메소드로 호출 할 수있다. 내가 알고 싶었던 것은이 비디오를 재생하는 스레드가 멈 추면 확인하는 방법이 있다면? 현재 재생되는 다른 애니메이션은 동시에 실행되며, 나는 그것을 원하지 않습니다. 기본적으로 애니메이션의 다음 세트 또는 스플래시 화면 애니메이션이 중지 된 후에 만 ​​계속 진행하기를 원합니다.스레드가 Python으로 끝났는지 확인하는 방법

이의 형태로 내가 과거에 is_alive() 사용한 코드의 꽤 ....

# ====================== 
# imports 
# ====================== 
import tkinter as tk 
import imageio 
import threading 
from PIL import Image, ImageTk 

LARGE_FONT = ("Segoe UI", 18) 


# ======================= 
# INITIALISATION - MAIN 
# ======================= 
class MyApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     container = tk.Frame(self) 
     container.pack(side='top', fill='both', expand=True) 
     container.grid_rowconfigure(0, weight=1) 
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (SplashScreen, UserSetup, TimerSetup): 
      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row=0, column=0, sticky='nsew') 
     self.show_frame(SplashScreen) 


    def show_frame(self, cont): 
     frame = self.frames[cont] 
     frame.tkraise() 


# ====================== 
# PAGES 
# ====================== 
""" To add new pages, just create a page class which inherits from tk.Frame, 
    add it to the dictionary, and add buttons for navigation """ 


class SplashScreen(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 

     video_name = "img//splash.avi" # This is your video file path 
     video = imageio.get_reader(video_name) 

     def stream(label): 
      for image in video.iter_data(): 
       frame_image = ImageTk.PhotoImage(Image.fromarray(image)) 
       label.config(image=frame_image) 
       label.image = frame_image 
      controller.show_frame(UserSetup) 

     def forget(): 
      my_label.pack_forget() 

     my_label = tk.Label(self) 
     my_label.pack() 
     my_label.after(ms=15000, func=forget) 
     thread = threading.Thread(target=stream, args=(my_label,)) 
     thread.daemon = 1 
     thread.setName("splash") 
     thread.start() 
     print(thread.getName()) 


class UserSetup(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 


class TimerSetup(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 


# ====================== 
# INITIALISATION (MAIN) 
# ====================== 
app = MyApp() 
#app.overrideredirect(True) 
app.mainloop() 

답변

0

..입니다 :

while thread_name.is_alive(): 
    pass 

이에 스레드를 기다립니다 스크립트의 다음 부분을 계속하기 전에 완료하십시오.

희망이 도움이됩니다. 루크

+0

안녕 루크, 팁 고맙습니다! 그것을 줄 것이고 무슨 일이 일어날 지 알려줄 것입니다 :) – Ants

+0

안녕 루크, 당신의 제안을 시도했지만, 지금은 나에게 다른 이상한 오류의 모든 종류를 제공하고 있습니다. 이것은 클래스 메소드로 스트림 (label) 함수를 다시 작성하지 않았다는 것과 관련이 있다고 생각합니다. 먼저 이것을 시도한 다음 작동하는지 확인하십시오. – Ants

+0

'thread.join()'을 시도 할 수 있습니다. 그러나 현재 처리를 일시 중지하고 시작된 스레드가 완료 될 때까지 기다립니다. – Joules

관련 문제