programing

잠시 동안 루프에서 tqdm 진행 표시줄 사용

mailnote 2023. 5. 21. 11:50
반응형

잠시 동안 루프에서 tqdm 진행 표시줄 사용

저는 전당포가 독점 보드를 백만 번 돌아다니는 것을 시뮬레이션하는 코드를 만들고 있습니다.보드 회전이 이루어질 때마다 업데이트되는 tqdm 진행 표시줄을 원합니다.

아래는 저의 현재 코드입니다.저는 보드 회전수가 원하는 횟수를 초과할 때 정지하는 휴지 루프를 사용하고 있습니다.

import os
from openpyxl import Workbook
from monopolyfct import *


def main(runs, fileOutput):

    ### EXCEL SETUP ###
    theWorkbook = Workbook()                              # Creates the workbook interface.
    defaultSheet = theWorkbook.active                     # Creates the used worksheet.
    currentData = ["Current Table Turn", "Current Tile"]  # Makes EXCEL column titles.
    defaultSheet.append(currentData)                      # Appends column titles.

    ### CONTENT SETUP ###
    currentData = [1, 0]             # Sets starting position.
    defaultSheet.append(currentData) # Appends starting position.

    while currentData[0] <= runs:

        ### ROLLING THE DICES PROCESS ###
        dices = twinDiceRoll()
        currentData[1] += dices[2]  # Updating the current tile

        ### SURPASSING THE NUMBER OF TILES ONBOARD ###
        if currentData[1] > 37:   # If more than a table turn is achieved,
            currentData[0] += 1   # One more turn is registered
            currentData[1] -= 38  # Update the tile to one coresponding to a board tile.
        else:
            pass

        ### APPENDING AQUIRED DATA ###
        defaultSheet.append(currentData)

        ### MANAGIING SPECIAL TILES ###
        if currentData[1] == 2 or 15 or 31:   # Community chess
            pass                              #TODO: Make a mechanic simulating the community chest card draw and it's related action.
        elif currentData[1] == 5 or 20 or 34: # Chance
            pass                              #TODO: Make a mechanic simulating the chance card draw and it's related action.
        elif currentData[1] == 28:            # Go to Jail
            pass                              #TODO: Make a mechanic simulating the entire jail process

        ### TWIN DICE ROLL EXCEPTION ###
        if dices[3] is True:  # If the dices roll a double,
            pass              #TODO: Make a mechanic considering that three doubles sends one to Jail.


    ### STORING THE ACCUMULATED DATA ###
    theWorkbook.save(fileOutput)  # Compiles the data in a .xlxs file.


if __name__ == "__main__":
    terminalWidth = os.get_terminal_size().columns                                               # Gets current terminal width.
    space(3)
    print("Python Monopoly Statistics Renderer".upper().center(terminalWidth))                   # Prints the title.
    print("(PMSR)".center(terminalWidth))                                                        # Prints the acronym.
    space(2)
    runs = int(request("For how many table turns do you want the simulation to run?"))           # Prompts for the desired run ammount
    #runs = 1000
    fileOutput = request("What should be the name of the file in which statistics are stored?")  # Prompts for the desired store filename
    #fileOutput = "test"
    fileOutput += ".xlsx"                                                                        # Adds file extension to filename
    main(runs, fileOutput)

에서 수동 제어를 사용할 수 있습니다.tqdma를 지정하여total생성자의 인수입니다.설명서의 내용:

with tqdm(total=100) as pbar:
    for i in range(10):
        sleep(0.1)
        pbar.update(10)

갱신하다

수동으로 제어하려면tqdm컨텍스트 관리자(일명) 없이with문)을 사용한 후 진행률 표시줄을 닫아야 합니다.다음은 설명서의 또 다른 예입니다.

pbar = tqdm(total=100)
for i in range(10):
    sleep(0.1)
    pbar.update(10)
pbar.close()

이렇게 하려면 예상되는 총 런 수를 알아야 합니다.당신의 코드에서 그것은 다음과 같이 보일 수 있습니다.

...
pbar = tqdm(total = runs+1)
while currentData[0] <= runs:

    ### ROLLING THE DICES PROCESS ###
    dices = twinDiceRoll()
    currentData[1] += dices[2]  # Updating the current tile

    ### SURPASSING THE NUMBER OF TILES ONBOARD ###
    if currentData[1] > 37:   # If more than a table turn is achieved,
        currentData[0] += 1   # One more turn is registered
        currentData[1] -= 38  # Update the tile to one coresponding to a board tile.
        pbar.update(1)
    else:
        pass
...
pbar.close()

하지만, 이 코드는 완벽하지 않습니다: 만약에currentData[1]항상 37보다 작음 - 진행률 표시줄이 중지되고 업데이트되지 않습니다.에서 업데이트를 시도하는 경우else:...부분적으로, 당신은 위반할 수 있습니다.total상행의이것은 시작입니다 :)

이 게시물은 관심이 쏠리기 때문에 무한 반복으로 이를 달성할 수 있는 방법도 짚어보는 것이 좋겠다고 생각했습니다.

tqdm과 함께 무한 루프를 사용하려면 생성기를 사용하여 while 루프를 무한 루프로 변경해야 합니다.

무한 루프(진행 표시줄 없음)

while True:
  # Do stuff here

무한 루프(진행 표시줄 포함)

def generator():
  while True:
    yield

for _ in tqdm(generator()):
  # Do stuff here

위의 코드는 이와 유사한 무한 진행 표시줄을 만듭니다.

16it [01:38,  6.18s/it]

또한 제너레이터가 조건에 따라 작동하도록 수정될 수 있습니다.

def generator():
  while condition:
    yield

사용자 12128336님의 답변을 위한 추가 버전입니다.

생성기 내에서 모든 반복 작업을 수행할 수 있습니다.그냥 추가yield반복의 끝에

from tqdm.auto import tqdm
from time import sleep


def generator():
    while True:
        sleep(0.3) # iteration stuff
        yield
        
for _ in tqdm(generator()): pass

# 77it [00:23,  3.25it/s]

시간이 많이 흘렀지만 이 대답은 누군가에게 도움이 될 수 있습니다. opencv를 사용하여 비디오 파일의 프레임을 읽고 싶다고 가정할 때 일반적인 방법은 루프하는 동안 만드는 것입니다.IsOpened()는 True를 반환합니다. 다음과 같습니다.

def frame_extractor(video_file = video_file):
    cap = cv2.VideoCapture(video_file) 
    if not cap.isOpened(): 
        print("Error opening video stream or file")
    grabbed_frame = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if ret == True:
            grabbed_frame += 1
            cv2.imwrite(f'{grabbed_frame}.jpg',frame)
        else: 
          break
    cap.release()

전체 프레임을 알고 있다면 아래와 같이 tqdm을 사용할 수 있습니다.

all_frames = 1000
progress_bar = iter(tqdm(range(all_frames)))
def frame_extractor(video_file = video_file):
    cap = cv2.VideoCapture(video_file) 
    if not cap.isOpened(): 
        print("Error opening video stream or file")
    grabbed_frame = 0
    while cap.isOpened():
        next(progress_bar)
        ret, frame = cap.read()
        if ret == True:
            grabbed_frame += 1
            cv2.imwrite(f'{grabbed_frame}.jpg',frame)
        else: 
          break
    cap.release()

이것은 루프의 길이를 알고 있는 경우에만 작동합니다. 그렇지 않으면 위의 답변 중 하나를 시도해야 합니다.

언급URL : https://stackoverflow.com/questions/45808140/using-tqdm-progress-bar-in-a-while-loop

반응형