python:线程 class 来自 main_window class

python: Threading classes from main_window class

我正在尝试使用 Tkinter 创建一个游戏,该游戏可以使用线程同时从多个 class 对象 运行 运行。在主窗口 class 中,我将 "player" 和 "player2" 分配给 "Player" class。

在 "Player" class 中,有一个名为 "move" 的函数可以简单地移动 canvas 对象。

当按下右键时,"player"开始moving.However,当按下左键时,似乎"player"被停止以代替"player2" ].

有办法解决这个问题吗?

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

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 class 中创建,这些播放器中的函数在 MainWindow class 中 运行。无论如何,是否可以将这些播放器对象独立地连接到 运行?

1) 您需要修复模型并在 model/data 和 representation/visualization 之间进行分隔:

players只需要保存他们的数据,并不负责绘制任何东西。你应该有一个主渲染循环负责读取显示器上的组件,并相应地定位它们。

2) players 不是 threads 并且不需要对它们进行守护进程。 Threads 作为单独的进程运行函数。在你的情况下,单独的过程是开始以一定的速度移动玩家,即:

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