阻止外部循环的最佳方法是什么?

2024-07-01 08:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个打印微调器的python脚本。这个旋转器有望一直持续到停止

spinnerFrames = [
    "/",
    "-",
    "\\",
    "|",
]

def spinner():
  i = 0
  while True:
    clearScreen() #function to clear the screen
    print(spinnerFrames[i])
    i = i + 1
    if (i == 3):
      i = 0
    sleep(0.15)

spinner()
sleep(3)
# break out here
print("Done!")

我知道你可以做sys.stdout.write()然后只删除那一行,但这不是重点

我想不出停止循环并退出函数的最佳方法。(在我的代码中继续)我希望能够从您称之为的循环中分离出来,因为我希望这是一个Pip包

我想这是可能的,尽管我不知道怎么做。谢谢你的帮助


Tags: theto脚本truedeffunctionsleepscreen
3条回答

您需要异步运行它,就像多处理库允许您这样做一样。当你创建一个单独的线程时,你会在它上面留下一个句柄,当你想要它停止时,你可以用它来杀死它

from multiprocessing import Process
from time import sleep
spinnerFrames = [
    "/",
    "-",
    "\\",
    "|",
]
def spinner():
  i = 0
  while True:
    print(spinnerFrames[i], end='\r')
    i = i + 1
    if (i == 3):
      i = 0
    sleep(0.15)
    
if __name__ == '__main__':
  p = Process(target=spinner)
  p.start()
  sleep(3)
  p.terminate()
  print("Done!")

记录启动时间,如果当前时间-启动时间>则断开循环; 持续时间

import time
spinnerFrames = [
    "/",
    "-",
    "\\",
    "|",
]

def spinner():
  i = 0
  startTime = time.time()# record starting time
  duration = 3
  while True:
    clearScreen() #function to clear the screen
    print(spinnerFrames[i])
    i = i + 1
    if (i == 3):
      i = 0
    if time.time() - startTime > duration:
      break
    sleep(0.15)

spinner()
print("Done!")

下面是我的一个项目的参考实现。它打印的是点而不是微调器,但更改起来很简单:

import threading
import time

def indicate_wait(func): 
    active = threading.Lock() 
     
    def dot_printer(): 
        while active.locked(): 
            print('.', end='', flush=True) 
            time.sleep(1) 
             
    def wrapper(*args, **kwargs): 
        t = threading.Thread(target=dot_printer) 
        active.acquire() 
        t.start() 
        res = func(*args, **kwargs) 
        active.release() 
        return res 
     
    return wrapper 

例如:

@indicate_wait 
def test(): 
    time.sleep(5) 

相关问题 更多 >

    热门问题