如何在函数完成后结束动画

时间:2017-05-10 20:52:52

标签: python-2.7 function

我正在编写一个简单的程序来关注几个地址。

我希望在程序运行时运行一个简单的文本光标动画。我成功地做到了。但是,我的问题是,在执行扫描的功能完成后,动画继续运行,直到我按下break键才会停止。

import os
import time
import sys
import itertools
import threading

hostname = [multiple site list]

def responder(hostname):
    while True:

      for item in hostname:

         response = os.system("ping -q -c 1 -n > /dev/null 2>&1 " + item)

         if response == 0:
            time.sleep(2)
         else:
            print item, 'is DOWN!'
            sys.exit()

def animate():
  for c in itertools.cycle(['|', '\'']):

    sys.stdout.write('\rscanning for bums > ' + c)
    sys.stdout.flush()
    time.sleep(0.1)

t = threading.Thread(target=animate)
t.start()

responder(hostname)

我知道代码可能有点乱,因为我已经完成了项目的一半,但是知道它是什么我可以改变以使动画在响应函数退出时停止?

1 个答案:

答案 0 :(得分:1)

您需要将threading.Event传递给animate函数并在希望停止时设置它:

import os
import time
import sys
import itertools
import threading

hostname = ['bogus.org']

def responder(hostname, t, quit_flag):
    while True:
        for item in hostname:
            response = os.system("ping -q -c 1 -n %s >> /dev/null 2>&1" % item)
            if response == 0:
                time.sleep(2)
            else:
                quit_flag.set()
                t.join()
                print "%s is DOWN!" % item
                return

def animate(quit_flag):
    for c in itertools.cycle(['|', '\'']):
        if quit_flag.is_set():
            print ""
            break
        sys.stdout.write('\rscanning for bums %s > %s' % (quit_flag.is_set(), c))
        sys.stdout.flush()
        time.sleep(0.1)

quit_flag = threading.Event()
t = threading.Thread(target=animate, args=(quit_flag,))
t.daemon = True
t.start()

responder(hostname, t, quit_flag)

我修改了你的responder函数,以便它设置退出标志,加入animate线程,打印消息,然后返回。这可以保证在打印消息之前完成animate线程。

我意识到尝试使用常规变量不起作用,因为只有值传递给animate函数。如果您不想使用threading.Event,则可以使用单个元素数组或其他将通过引用传递的对象。