2016-09-27 12 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

こんにちはルーク、あなたの提案を試してみましたが、今それは私にあらゆる種類の奇妙なエラーを与えています。これは、クラスメソッドとしてストリーム(ラベル)関数をまだ書き換えていないという事実と関係していると思います。最初にこれを試してから動作するか確認してください。 – Ants

+0

'thread.join()'を試すと、現在の処理を一時停止し、開始したスレッドが終了するのを待ちます。 – Joules

関連する問題