Python 如何在tkinter中使用多处理或线程

Python 如何在tkinter中使用多处理或线程,python,animation,tkinter,multiprocessing,Python,Animation,Tkinter,Multiprocessing,我正在尝试制作一个简单的太空入侵者游戏,我遇到的一个问题是让事情不能同时发生。我已经将射击动作绑定到了游戏的画布上,这样当你点击一个函数时就会被调用。我希望这个函数可以一次调用多次,以便在任何时候都可以在屏幕上看到多个激光/子弹。当你点击屏幕上的激光/子弹时,上一个会消失,出现一个新的。代码: class Game1(): def __init__(self, xcoord1=380, ycoord1=550, xcoord2=400, ycoord2=570): self.Maste

我正在尝试制作一个简单的太空入侵者游戏,我遇到的一个问题是让事情不能同时发生。我已经将射击动作绑定到了游戏的画布上,这样当你点击一个函数时就会被调用。我希望这个函数可以一次调用多次,以便在任何时候都可以在屏幕上看到多个激光/子弹。当你点击屏幕上的激光/子弹时,上一个会消失,出现一个新的。代码:

class Game1():

def __init__(self, xcoord1=380, ycoord1=550, xcoord2=400, ycoord2=570):
    self.Master = Master
    self.Master.geometry("800x600+300+150")
    Game1Canvas = Canvas(self.Master, bg="black", height=600, width=800)
    Game1Canvas.place(x=0, y=0)
    self.Canvas = Game1Canvas
    self.Canvas.bind("<Button-1>", self.Shoot)
    self.Ship = self.Canvas.create_rectangle(self.xcoord1, self.ycoord1, self.xcoord2, self.ycoord2, fill = "red")

def Shoot(self):
    self.LaserLocation = 0
    for self.LaserLocation in range(0 , 112):
        Master.after(1, self.Canvas.create_rectangle(self.xcoord1, self.ycoord1 - (self.LaserLocation * 5), self.xcoord2 - 5, self.ycoord2 - (self.LaserLocation * 5), fill = "pink", tag=str(CurrentTag)))
        Master.update()
        self.Canvas.delete(str(CurrentTag))

这是一个更加简化的代码版本,因为我一直在尝试各种不同的方法来让它工作,结果一团糟。我知道多处理和线程导入,我已经尝试了这两种方法,但无法让它们在我的代码中工作。如果有人能回信给我一个解决方案,我将非常感激。干杯。

您不需要使用多线程或多处理。您也不需要也不希望每毫秒或每毫秒绘制多次新矩形

解决方案是让shot函数只创建一个矩形,并将其添加到列表中。然后,使用简单的动画机制,在列表上迭代,并将每个项目符号向上移动一到两个像素。您可以通过创建一个每隔20-30毫秒调用自身的函数来实现这一点

解决方案如下所示:

def Shoot(self):
    laser = self.Canvas.create_rectangle(...)
    self.lasers.append(laser)

def do_animation(self):
    # make a copy of the list of lasers to iterate
    # over, so we can remove items from the original
    # list when they go off screen
    lasers = self.lasers[:]
    for laser in lasers:
        # get current coordinates of this laser
        (x0,y0,x1,y1) = self.canvas.bbox(laser)

        if x1 < self.canvas.winfo_height():
            # if it is not off screen, move it up
            self.canvas.move(laser, 0, -10)
        else:
            # if it IS off screen, delete it
            self.canvas.delete(laser)
            self.lasers.remove(laser)

    self.after(30, self.do_animation)

以上内容将每30毫秒移动一次激光器,速度约为33 fps。

这真的不需要穿线。。。你应该在画布上记录下所有的“子弹”并画出来。好吧,我对这一点很在行,我正在努力理解这将如何解决多个激光同时在屏幕上运行的问题。如果为一台激光器运行do_动画功能,那么其他激光器将如何移动?或者这和self.lasers系列中的激光器有关,因为我不太明白那个会做什么?作为旁注,对于实际制作动画,您认为最好的方法是什么?我认为删除它并将其向上移动是好的,还是有一种我从未听说过的更有效的方法?非常感谢。哦,好吧,没关系,我知道你现在做了什么,但是如果你能给我一个好的方法来制作矩形动画,那就太好了。干杯。@ElliotHoward:我更新了我的答案,加入了一个更完整的例子。