잠시 동안 루프에서 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
'programing' 카테고리의 다른 글
| req.포스트에 비어있는 본문 (0) | 2023.05.21 |
|---|---|
| .NET의 두 바이트 배열 비교 (0) | 2023.05.21 |
| 시트를 삭제하고 대신 사용자 지정 메시지를 사용하여 Excel이 사용자에게 확인을 요청하지 않도록 합니다. (0) | 2023.05.21 |
| 생산 코드에 NSLog()를 사용하면 안 된다는 것이 사실입니까? (0) | 2023.05.21 |
| 기본값 유형이 속성 유형과 일치하지 않습니다. (0) | 2023.05.21 |