2016-09-28 21 views
0

我想創建一個使用Tkinter的遊戲,它可以使用線程同時運行多個類對象的函數。在MainWindow類中,我將「player」和「player2」分配給「Player」類。python:線程類main_window類

在「Player」類中,有一個名爲「move」的函數,它簡單地移動畫布對象。

當按下右鍵時,「播放器」開始移動。但是,只要按下左鍵,看起來「播放器」停止替代「播放器2」。

有沒有辦法解決這個問題?

from tkinter import * 
from threading import Thread 
import time 


class MainWindow(Frame): 
    def __init__(self , parent): 
     self.backround = '#%02x%02x%02x' % (180, 180, 180) 
     self.main_width = 1905 
     self.main_height = 1002 

     Frame.__init__(self , parent , bg = self.backround) 
     self.pack(fill=BOTH, expand=1) 
     self.parent = parent 
     self.parent.geometry('1905x1002+0+0') 
     self.main_canvas = Canvas(self , width = self.main_width , height =  
     self.main_height , bg = 'white') 
     self.main_canvas.pack() 

     self.Keyboard_Events = Thread(target = self.keyboard_events) 
     self.Keyboard_Events.start() 

球員

 self.player = Player(self.main_canvas , [125 , 125] , self) #(canvas , coords) 
     self.player2 = Player(self.main_canvas , [200 , 100] , self) #(canvas , coords) 

回調

def keyboard_events(self): 
     def callback_mouse_primary(event): 
      self.player.move(0.01) 
     def callback_mouse_secondary(event): 
      self.player2.move(0.01) 

     root.bind('<Button-1>' , callback_mouse_primary) 
     root.bind('<Button-3>' , callback_mouse_secondary) 

播放器類

class Player(Thread): 
    def __init__(self , canvas , coords , parent): 
     Thread.__init__(self) 
     self.setDaemon(True) 
     self.canvas = canvas 
     self.coords = coords 
     self.player_object = self.canvas.create_rectangle(self.coords[0]-25 , self.coords[1]-25 , self.coords[0]+25 , self.coords[1]+25) 

    def move(self , Time): 

     for y in range(100): 
      self.canvas.coords(self.player_object , self.coords[0]-25 , self.coords[1]-25 , self.coords[0]+25 , self.coords[1]+25) 
      self.coords[0] += 0.1 
      self.coords[1] += 0.1 
      self.canvas.update() 
      time.sleep(Time) 

    def Print_info (self): 
     print (self.coords) 

if __name__ == '__main__': 
    root = Tk() 
    main = MainWindow(root) 
    root.mainloop() 

只是爲了說清楚。播放器對象是在MainWindow類中創建的,並且這些播放器中的函數在MainWindow類中運行。無論如何要讓這些玩家對象獨立運行?

+1

你應該**永遠**更新比主線程其他線程的GUI ...你可以在線程中做所有你想要的邏輯和處理......但絕不會在除main_thread之外的任何線程中更新GUI –

回答

0

1)您需要解決您的模型,並有模型/數據和表示/可視化之間的分離:

players只需要保存自己的數據,而不是負責制定什麼。您應該有一個主渲染循環負責讀取顯示器上的組件,並相應地對其進行定位。

2)players不是threads並且不需要對它們進行守護。 Threads作爲一個單獨的過程運行。在你的情況下,單獨的進程是開始以一定的速率移動的球員,那幸福:

def callback_mouse_primary(event): 
     t=Thread(target=self.player.move,kwargs={'Time': 0.01}) 
     t.start()