2017-09-01 8 views
0

私はallThreads.musicQueueによってmainthreadからmusicQueueにアクセスしようとすると、私は、スクリプト内のすべての既存のスレッドを監視し、クラスshowAllThreads(音楽プレーヤー)変数(パイソン)

class showAllThreads(threading.Thread): 

    def __init__(self, *args, **kwargs): 
     threading.Thread.__init__(self, *args, **kwargs) 
     self.daemon = True 
     self.start() 

    #Shows whether the playing music is in queue, initially false 
    musicQueue = False 

    def run(self): 
     while True: 
      allThreads = threading.enumerate() 
      for i in allThreads: 
       if i.name == "PlayMusic" and i.queue == True: 
        musicQueue = True 
        print("Playlist is on") 
       elif i.name == "PlayMusic" and i.queue == False: 
        musicQueue = False 
        print("Playlist is off") 
       else: 
        musicQueue = False 
      time.sleep(2) 

を持っていますwhileループがmusicQueue = Trueを実行しても、allThreads = showAllThreads()は常に私に値Falseを与えます。 printコマンドが正常に終了するので、プレイリストがオンであることがわかります。

答えて

1

"musicQueue"は、まずクラスレベル(クラスのすべてのインスタンス間で共有される属性)になり、次にrun()メソッドのローカル変数として2つの場所で定義されます。これらは完全に異なる2つの名前なので、ローカル変数にどのような方法でもクラスレベルのものを変更することは期待できません。

私は、あなたは、Pythonに新しいしていると、それのオブジェクトモデルがどのように動作するか、それは最も主流のOOPLsとどのように異なるかを学ぶために時間がかからなかったと仮定します。

class ShowAllThreads(threading.Thread): 

    def __init__(self, *args, **kwargs): 
     threading.Thread.__init__(self, *args, **kwargs) 
     self.daemon = True 
     # create an instance variable 
     self.musicQueue = False 
     self.start() 

    def run(self): 
     while True: 
      allThreads = threading.enumerate() 
      for i in allThreads: 
       if i.name == "PlayMusic" and i.queue == True: 
        # rebind the instance variable 
        self.musicQueue = True 
        print("Playlist is on") 

       elif i.name == "PlayMusic" and i.queue == False: 
        self.musicQueue = False 
        print("Playlist is off") 

       else: 
        self.musicQueue = False 
      time.sleep(2) 
:あなたは本当にあなたがここに欲しいこと musicQueueインスタンス変数を作成し、 run()以内にそれを割り当てることが明らかであるあなたはPythonでコーディングを楽しむことを望むならば...はず