如何在Python中同时运行两个while循环?

如何在Python中同时运行两个while循环?,python,parallel-processing,python-multithreading,Python,Parallel Processing,Python Multithreading,我是Python新手,使用Zelle的图形创建游戏。我需要下面的两个while循环同时运行,但是我遇到了困难。我尝试嵌套while循环,但是马和平民只有在点击鼠标时才会移动,这是我不想要的。我想要的是马和平民总是在移动,公主只有在点击鼠标时才移动,并且在她救了10名平民后停止游戏并发出“游戏结束”的声音 # animation loop. while True==True: for horse in horseList: if horse.leg.getX()

我是Python新手,使用Zelle的图形创建游戏。我需要下面的两个while循环同时运行,但是我遇到了困难。我尝试嵌套while循环,但是马和平民只有在点击鼠标时才会移动,这是我不想要的。我想要的是马和平民总是在移动,公主只有在点击鼠标时才移动,并且在她救了10名平民后停止游戏并发出“游戏结束”的声音

    # animation loop.
while True==True:

    for horse in horseList:
        if horse.leg.getX() > -187:
            horse.move( -1, 20 )
        else:
            horse.move( 5, 28 )

    for civilian in civiliansList:

        if civilian.getX() < 800:
            civilian.move( 20, 0 )
        else:
            civilian.move( -100, 0 )

while civiliansSaved != 10:

    mouse = win.getMouse()

    princess.move( mouse, civilianCounter)

    civilianCounter = princess.move( mouse, civilianCounter)
    # move is a method that will return an updated civilianCounter ( it is initially 0 and defined outside of the while loop ), depending on whether princess runs into civilians

else:
    print( "Game over" )
    win.getMouse()
    win.close()
#动画循环。
而True==True:
对于马匹列表中的马:
如果horse.leg.getX()>-187:
马。移动(-1,20)
其他:
马。移动(5,28)
对于民事清单中的民事:
如果civil.getX()小于800:
平民。移动(20,0)
其他:
平民。移动(-100,0)
当公民被拯救的时候!=10:
mouse=win.getMouse()
公主。移动(鼠标,文明计数器)
civilianCounter=公主。移动(鼠标,civilianCounter)
#move是一个方法,它将返回一个更新的civilianCounter(它最初是0,在while循环之外定义),这取决于princess是否遇到平民
其他:
打印(“游戏结束”)
win.getMouse()
赢
只需在动画循环中使用
checkMouse()
而不是
getMouse()

我想就这么简单

while civiliansSaved < 11:

    for horse in horseList:
        if horse.leg.getX() > -187      
            horse.move( -1, 20 )
        else:
            horse.move( 5, 28 )

    for civilian in civiliansList:
        if civilian.getX() < 800:
            civilian.move( 20, 0 )
        else:
            civilian.move( -100, 0 )

    mouse = win.checkMouse()

    if mouse:
        princess.move( mouse, civilianCounter)
        civilianCounter = princess.move( mouse, civilianCounter)

print( "Game over" )
win.getMouse()
win.close()
当CiviliansSave<11时:
对于马匹列表中的马:
如果horse.leg.getX()>-187
马。移动(-1,20)
其他:
马。移动(5,28)
对于民事清单中的民事:
如果civil.getX()小于800:
平民。移动(20,0)
其他:
平民。移动(-100,0)
mouse=win.checkMouse()
如果使用鼠标:
公主。移动(鼠标,文明计数器)
civilianCounter=公主。移动(鼠标,civilianCounter)
打印(“游戏结束”)
win.getMouse()
赢
文件:

checkMouse()类似于getMouse,但不会因用户单击而暂停。 返回鼠标单击的最新点,如果 自上次调用checkMouse或之后未单击的窗口 抓老鼠。这对于控制简单的动画循环特别有用


下面是一个示例,它可以做您想要做的事情,而不需要并行处理(这在python中很棘手):

while True:#您不需要编写True==True
对于马匹列表中的马:
如果horse.leg.getX()>-187:
马。移动(-1,20)
其他:
马。移动(5,28)
对于民事清单中的民事:
如果civil.getX()小于800:
平民。移动(20,0)
其他:
平民。移动(-100,0)
mouse=win.getMouse()
公主。移动(鼠标,文明计数器)
civilianCounter=公主。移动(鼠标,civilianCounter)
如果CivilianSaved>=10:#检查是否保存了10个或更多
打破
打印(“游戏结束”)
win.getMouse()
赢

您要做的是保持游戏运行,直到civilianSaved计数器至少为10。但是你不能在一个独立于主游戏循环的循环中这样做,所以在计数至少为10之前不停止游戏是更有意义的。这个if语句可以包含在您的主游戏循环中。

Zelle的图形不是一个事件驱动的图形工具,我认为这正是您所需要的。也许考虑切换到代码> TKTET/<代码>,这是Python标准库的一部分。您可以使用回调函数来处理鼠标事件,以便您的应用程序在等待处理鼠标事件时可以自由执行其他操作

tkinter
具有
after()
功能,允许您在指定时间段后调用函数。您可以为
平民移动
马匹移动
创建单独的函数,并在指定的时间段(例如50毫秒)后调用这些函数。这有效地模拟了并行运行功能,并允许马和平民同时移动,至少从用户的角度来看是这样。您需要在movement函数中再次调用
after()
,以便连续调用它们

self.root.after(50, self.process_horse_movement)
self.root.after(50, self.process_civilian_movement)
然后在每个移动功能结束时:

def process_horse_movement():
    ...
    self.root.after(50, self.process_horse_movement)

def process_civilian_movement():
    ...
    self.root.after(50, self.process_civilian_movement)

还有一个小问题。使用
而不是
而使用
而不是

你试过把第一圈的东西移到第二圈吗?第一个循环是不必要的。如果两个循环的内容总是同时发生,并且当
civiliansSaved
达到
10
时,两个循环都必须停止,那么它们应该与
civiliansSaved!=10
条件。看起来您只需要同时运行两个函数。这里有一个类似的线索可能会有所帮助:您可以尝试这样做:在这个解决方案中,每次单击鼠标时,马只移动一次。我的理解是,当你不点击鼠标时,它们应该保持移动。
def process_horse_movement():
    ...
    self.root.after(50, self.process_horse_movement)

def process_civilian_movement():
    ...
    self.root.after(50, self.process_civilian_movement)