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:我更新了我的答案,加入了一个更完整的例子。