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類中運行。無論如何要讓這些玩家對象獨立運行?
你應該**永遠**更新比主線程其他線程的GUI ...你可以在線程中做所有你想要的邏輯和處理......但絕不會在除main_thread之外的任何線程中更新GUI –