Python: 如何将计数器在变量范围内的位置显示为文本条(类似于进度条)?
Python: How to display the position of a counter in a variable range as a text bar (similar to the progress bar)?
我正在尝试动态显示一个在不断变化的范围内不断变化的正数。对于具体的例子,让我们想象它代表股票的动态价格,其中范围是其当前的每日范围。
假设代码是 X,今天开盘价为 100 美元,日内涨至 125 美元,目前交易价格为 112.5 美元。所以理想情况下,我想将其显示为动态进度条:
X [#### ] 112.5 [100, 125]
如果股票在同一天涨到 130,同样的进度条现在应该看起来像
X [########] 130 [100, 130]
(注意:我没有限制进度条的 长度 是否应该随着范围的增加而改变 - 我只是问当前价格应该在视觉上准确地表示为范围的百分比。)
知道我应该查看哪些包(我真的不想从头开始实施!!)
如果可能,也请提出 python 3.x 方法。
这是一个非常简单的示例,说明如何在控制台上制作状态栏:
import sys
import time
def progress(count, total, status=''):
bar_len = 60 # the lenght of the status bar
filled_len = int(round(bar_len * count / float(total)))
percents = round(100.0 * count / float(total), 1)
bar = '#' * filled_len + '-' * (bar_len - filled_len)
sys.stdout.write('[%s] %s%s ...%s\r' % (bar, percents, '%', status))
sys.stdout.flush()
a=0
while a < 50:
progress(a, 100)
a = a+5
time.sleep(2)
所以,在上面的例子中,progress 函数在 while loop
中被调用,直到变量 a
达到 50。所以,重要的是 progress
函数。
希望对你有所帮助!
您可以使用打印语句自行创建:
基字符串是 f"X [{variable}:>{length}] {value:.0f} [{value_min}, {value_max}]"
。你要找到的是变量并设置长度:
length = 20 # 20 characters
value = 112.5
value_min = 100
value_max = 125
percentage = ((value - value_min) / (value_max - value_min)) * 100
variable = '#' * int(percentage / 100 * length) # int is a floor function, you can deal with it how you like but we need an integer value.
string = f"X [{variable:<{length}}] {value:.0f} [{value_min}, {value_max}]"
print(string)
>>> X [########## ] 112 [100, 125]
当你把它放在一个 for 循环中时,你也可以覆盖上一行:
import time
for x in range(10):
print(x, end='\r', flush=True)
time.sleep(0.5)
例如:
length = 20 # 20 characters
value = 112.5
value_min = 100
value_max = 125
for value in range(value_min, value_max):
percentage = ((value - value_min) / (value_max - value_min)) * 100
variable = '#' * int(percentage / 100 * length)
string = f"X [{variable:<{length}}] {value:.0f} [{value_min}, {value_max}]"
print(string)
输出:(我没有覆盖显示输出的行)。
X [ ] 100 [100, 125]
X [ ] 101 [100, 125]
X [# ] 102 [100, 125]
X [## ] 103 [100, 125]
X [### ] 104 [100, 125]
X [#### ] 105 [100, 125]
X [#### ] 106 [100, 125]
X [##### ] 107 [100, 125]
X [###### ] 108 [100, 125]
X [####### ] 109 [100, 125]
X [######## ] 110 [100, 125]
X [######## ] 111 [100, 125]
X [######### ] 112 [100, 125]
X [########## ] 113 [100, 125]
X [########### ] 114 [100, 125]
X [############ ] 115 [100, 125]
X [############ ] 116 [100, 125]
X [############# ] 117 [100, 125]
X [############## ] 118 [100, 125]
X [############### ] 119 [100, 125]
X [################ ] 120 [100, 125]
X [################ ] 121 [100, 125]
X [################# ] 122 [100, 125]
X [################## ] 123 [100, 125]
X [################### ] 124 [100, 125]
当最大值改变时:
length = 20 # 20 characters
value_min = 100
value_max = 125
values = [112.5, 125, 130, 110]
for value in values:
if value > value_max:
value_max = value
percentage = ((value - value_min) / (value_max - value_min)) * 100
variable = '#' * int(percentage / 100 * length)
string = f"X [{variable:<{length}}] {value:.0f} [{value_min}, {value_max}]"
print(string)
输出:
X [########## ] 112 [100, 125]
X [####################] 125 [100, 125]
X [####################] 130 [100, 130]
X [###### ] 110 [100, 130]
def progress_string(symbol, start, end, actual, bar_len=10):
fill = int(bar_len*(actual-start)/(end-start))
string = "#"*fill + " "*(bar_len-fill)
if actual<start:
string = " "*bar_len
if actual>end:
string = "#"*bar_len
return "%s [%s] %.2f [%i, %i]"%(symbol, string, actual, start, end)
### TEST ###
START = 100
END = 125
X = 100
while X<=END:
X+=.001
time.sleep(.001)
sys.stdout.flush()
print(progress_string("X", START, END, X, bar_len=25), end="\r")
这也将每次替换进度条。
我正在尝试动态显示一个在不断变化的范围内不断变化的正数。对于具体的例子,让我们想象它代表股票的动态价格,其中范围是其当前的每日范围。
假设代码是 X,今天开盘价为 100 美元,日内涨至 125 美元,目前交易价格为 112.5 美元。所以理想情况下,我想将其显示为动态进度条:
X [#### ] 112.5 [100, 125]
如果股票在同一天涨到 130,同样的进度条现在应该看起来像
X [########] 130 [100, 130]
(注意:我没有限制进度条的 长度 是否应该随着范围的增加而改变 - 我只是问当前价格应该在视觉上准确地表示为范围的百分比。)
知道我应该查看哪些包(我真的不想从头开始实施!!)
如果可能,也请提出 python 3.x 方法。
这是一个非常简单的示例,说明如何在控制台上制作状态栏:
import sys
import time
def progress(count, total, status=''):
bar_len = 60 # the lenght of the status bar
filled_len = int(round(bar_len * count / float(total)))
percents = round(100.0 * count / float(total), 1)
bar = '#' * filled_len + '-' * (bar_len - filled_len)
sys.stdout.write('[%s] %s%s ...%s\r' % (bar, percents, '%', status))
sys.stdout.flush()
a=0
while a < 50:
progress(a, 100)
a = a+5
time.sleep(2)
所以,在上面的例子中,progress 函数在 while loop
中被调用,直到变量 a
达到 50。所以,重要的是 progress
函数。
希望对你有所帮助!
您可以使用打印语句自行创建:
基字符串是 f"X [{variable}:>{length}] {value:.0f} [{value_min}, {value_max}]"
。你要找到的是变量并设置长度:
length = 20 # 20 characters
value = 112.5
value_min = 100
value_max = 125
percentage = ((value - value_min) / (value_max - value_min)) * 100
variable = '#' * int(percentage / 100 * length) # int is a floor function, you can deal with it how you like but we need an integer value.
string = f"X [{variable:<{length}}] {value:.0f} [{value_min}, {value_max}]"
print(string)
>>> X [########## ] 112 [100, 125]
当你把它放在一个 for 循环中时,你也可以覆盖上一行:
import time
for x in range(10):
print(x, end='\r', flush=True)
time.sleep(0.5)
例如:
length = 20 # 20 characters
value = 112.5
value_min = 100
value_max = 125
for value in range(value_min, value_max):
percentage = ((value - value_min) / (value_max - value_min)) * 100
variable = '#' * int(percentage / 100 * length)
string = f"X [{variable:<{length}}] {value:.0f} [{value_min}, {value_max}]"
print(string)
输出:(我没有覆盖显示输出的行)。
X [ ] 100 [100, 125]
X [ ] 101 [100, 125]
X [# ] 102 [100, 125]
X [## ] 103 [100, 125]
X [### ] 104 [100, 125]
X [#### ] 105 [100, 125]
X [#### ] 106 [100, 125]
X [##### ] 107 [100, 125]
X [###### ] 108 [100, 125]
X [####### ] 109 [100, 125]
X [######## ] 110 [100, 125]
X [######## ] 111 [100, 125]
X [######### ] 112 [100, 125]
X [########## ] 113 [100, 125]
X [########### ] 114 [100, 125]
X [############ ] 115 [100, 125]
X [############ ] 116 [100, 125]
X [############# ] 117 [100, 125]
X [############## ] 118 [100, 125]
X [############### ] 119 [100, 125]
X [################ ] 120 [100, 125]
X [################ ] 121 [100, 125]
X [################# ] 122 [100, 125]
X [################## ] 123 [100, 125]
X [################### ] 124 [100, 125]
当最大值改变时:
length = 20 # 20 characters
value_min = 100
value_max = 125
values = [112.5, 125, 130, 110]
for value in values:
if value > value_max:
value_max = value
percentage = ((value - value_min) / (value_max - value_min)) * 100
variable = '#' * int(percentage / 100 * length)
string = f"X [{variable:<{length}}] {value:.0f} [{value_min}, {value_max}]"
print(string)
输出:
X [########## ] 112 [100, 125]
X [####################] 125 [100, 125]
X [####################] 130 [100, 130]
X [###### ] 110 [100, 130]
def progress_string(symbol, start, end, actual, bar_len=10):
fill = int(bar_len*(actual-start)/(end-start))
string = "#"*fill + " "*(bar_len-fill)
if actual<start:
string = " "*bar_len
if actual>end:
string = "#"*bar_len
return "%s [%s] %.2f [%i, %i]"%(symbol, string, actual, start, end)
### TEST ###
START = 100
END = 125
X = 100
while X<=END:
X+=.001
time.sleep(.001)
sys.stdout.flush()
print(progress_string("X", START, END, X, bar_len=25), end="\r")
这也将每次替换进度条。