Hola, estoy haciendo un script para generar combinaciones de palabras con las letras mknusculas del abecedario y los números, me gustaría ponerle una barra de progreso en la que muestre lo que llevael programa echo Ej: si de las 100 combinaciones que tiene que hacer encuentra 50, que ponga 50%, pero soy incapaz de hacerlo, muchas gracias a todos de antemano.
Aquí va el programita.
import time
import sys
length=int(raw_input("Numero maximo de caracteres: "))
name=raw_input("Introduce el nombre del fichero con formato (.txt): ")
tic = time.clock()
print ("Ejecutando, espera");
lista=[0 for x in xrange(length)]
x=length-1
string="abcdefghijklnmopqrstuvwxyz1234567890"
list_of_results=[]
file1=file(name,"w")
while(x>-1):
result=""
if lista[x]==len(string)-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]=0
x-=1
elif x==length-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
else:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
if x>0:
x+=1
else:
x=length-1
file1.write(result+"\n")
toc = time.clock()
ttn = toc - tic
print ("Completado en"+str(ttn)+" segundos.");
print ("Revisa "+str(name)+" en el directorio");
1) ¿dónde está el código que intentaste de la barra?
2)hay varias formas de hacerlo ya sea en consola o en modo gráfico
3)en modo consola sería algo asi: "***********" barra vacía y "######****" barra en progreso
el porcentaje de progreso se obtiene de forma matemática por ej: vacia= 0 total=90 palabras
hechas=? porcentaje que se lleva es = ? x 100 / total (una simple regla de 3)
4) en modo gráfico depende que módulo uses: TK, GTK,etc
Hola y gracias por contestar, pero sigo sin entenderlo, el codigo que use, lo puse aparte en un modulo, y no esta ahi, el codigo para la barra de progreso es (modulo.py):
import sys
import time
class ProgressBar(object):
def __init__(self, start=0, end=10, width=12, fill='=', blank='.', format='[%(fill)s>%(blank)s] %(progress)s%%', incremental=True):
super(ProgressBar, self).__init__()
self.start = start
self.end = end
self.width = width
self.fill = fill
self.blank = blank
self.format = format
self.incremental = incremental
self.step = 100 / float(width) #fix
self.reset()
def __add__(self, increment):
increment = self._get_progress(increment)
if 100 > self.progress + increment:
self.progress += increment
else:
self.progress = 100
return self
def __str__(self):
progressed = int(self.progress / self.step) #fix
fill = progressed * self.fill
blank = (self.width - progressed) * self.blank
return self.format % {'fill': fill, 'blank': blank, 'progress': int(self.progress)}
__repr__ = __str__
def _get_progress(self, increment):
return float(increment * 100) / self.end
def reset(self):
"""Resets the current progress to the start point"""
self.progress = self._get_progress(self.start)
return self
class AnimatedProgressBar(ProgressBar):
"""Extends ProgressBar to allow you to use it straighforward on a script.
Accepts an extra keyword argument named `stdout` (by default use sys.stdout)
and may be any file-object to which send the progress status.
"""
def __init__(self, *args, **kwargs):
super(AnimatedProgressBar, self).__init__(*args, **kwargs)
self.stdout = kwargs.get('stdout', sys.stdout)
def show_progress(self):
if hasattr(self.stdout, 'isatty') and self.stdout.isatty():
self.stdout.write('\r')
else:
self.stdout.write('\n')
self.stdout.write(str(self))
self.stdout.flush()
if __name__ == '__main__':
p = AnimatedProgressBar(end=100, width=80)
while True:
p + 5
p.show_progress()
time.sleep(0.1)
if p.progress == 100:
break
print #new line
y el codigo que e actualizado para que me coja de ahi la barra es:
import time
import sys
from modulo import ProgressBar
p = ProgressBar()
car=raw_input("Caracteres a usar: ")
length=int(raw_input("Numero maximo de caracteres: "))
name=raw_input("Introduce el nombre del fichero con formato (.txt): ")
tic = time.clock()
print ("Ejecutando, espera");
lista=[0 for x in xrange(length)]
x=length-1
string=car
list_of_results=[]
file1=file(name,"w")
while(x>-1):
result=""
if lista[x]==len(string)-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]=0
x-=1
elif x==length-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
else:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
if x>0:
print p+1
x+=1
else:
x=length-1
file1.write(result+"\n")
toc = time.clock()
ttn = toc - tic
print ("Completado en"+str(ttn)+" segundos.");
print ("Revisa "+str(name)+" en el directorio");
es esto lo que me pides? si tucrees conveniente cambiar el codigo del modulo por otro o lo que sea... Pero gracias :D
Crees que habría que cambiar el módulo o de modulo?
Cita de: aalleexx en 9 Diciembre 2015, 17:29 PM
Hola y gracias por contestar, pero sigo sin entenderlo, el codigo que use, lo puse aparte en un modulo, y no esta ahi, el codigo para la barra de progreso es (modulo.py):
import sys
import time
class ProgressBar(object):
def __init__(self, start=0, end=10, width=12, fill='=', blank='.', format='[%(fill)s>%(blank)s] %(progress)s%%', incremental=True):
super(ProgressBar, self).__init__()
self.start = start
self.end = end
self.width = width
self.fill = fill
self.blank = blank
self.format = format
self.incremental = incremental
self.step = 100 / float(width) #fix
self.reset()
def __add__(self, increment):
increment = self._get_progress(increment)
if 100 > self.progress + increment:
self.progress += increment
else:
self.progress = 100
return self
def __str__(self):
progressed = int(self.progress / self.step) #fix
fill = progressed * self.fill
blank = (self.width - progressed) * self.blank
return self.format % {'fill': fill, 'blank': blank, 'progress': int(self.progress)}
__repr__ = __str__
def _get_progress(self, increment):
return float(increment * 100) / self.end
def reset(self):
"""Resets the current progress to the start point"""
self.progress = self._get_progress(self.start)
return self
class AnimatedProgressBar(ProgressBar):
"""Extends ProgressBar to allow you to use it straighforward on a script.
Accepts an extra keyword argument named `stdout` (by default use sys.stdout)
and may be any file-object to which send the progress status.
"""
def __init__(self, *args, **kwargs):
super(AnimatedProgressBar, self).__init__(*args, **kwargs)
self.stdout = kwargs.get('stdout', sys.stdout)
def show_progress(self):
if hasattr(self.stdout, 'isatty') and self.stdout.isatty():
self.stdout.write('\r')
else:
self.stdout.write('\n')
self.stdout.write(str(self))
self.stdout.flush()
if __name__ == '__main__':
p = AnimatedProgressBar(end=100, width=80)
while True:
p + 5
p.show_progress()
time.sleep(0.1)
if p.progress == 100:
break
print #new line
y el codigo que e actualizado para que me coja de ahi la barra es:
import time
import sys
from modulo import ProgressBar
p = ProgressBar()
car=raw_input("Caracteres a usar: ")
length=int(raw_input("Numero maximo de caracteres: "))
name=raw_input("Introduce el nombre del fichero con formato (.txt): ")
tic = time.clock()
print ("Ejecutando, espera");
lista=[0 for x in xrange(length)]
x=length-1
string=car
list_of_results=[]
file1=file(name,"w")
while(x>-1):
result=""
if lista[x]==len(string)-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]=0
x-=1
elif x==length-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
else:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
if x>0:
print p+1
x+=1
else:
x=length-1
file1.write(result+"\n")
toc = time.clock()
ttn = toc - tic
print ("Completado en"+str(ttn)+" segundos.");
print ("Revisa "+str(name)+" en el directorio");
es esto lo que me pides? si tucrees conveniente cambiar el codigo del modulo por otro o lo que sea... Pero gracias :D
Cita de: tincopasan en 9 Diciembre 2015, 17:25 PM
1) ¿dónde está el código que intentaste de la barra?
2)hay varias formas de hacerlo ya sea en consola o en modo gráfico
3)en modo consola sería algo asi: "***********" barra vacía y "######****" barra en progreso
el porcentaje de progreso se obtiene de forma matemática por ej: vacia= 0 total=90 palabras
hechas=? porcentaje que se lleva es = ? x 100 / total (una simple regla de 3)
4) en modo gráfico depende que módulo uses: TK, GTK,etc
El módulo que estoy usando es Pyprind,
Y el codigo al que le quiero añadir la barra es:
#v2.0
#imports
import time
#Variables de input
car=raw_input("Caracteres a usar: ")
length=int(raw_input("\nMaximo numero de caracteres: "))
name=raw_input("\nExtension y nombre de archivo: ")
#Ejecutando
tic = time.clock()
print ("Ejecutando, espera");
lista=[0 for x in xrange(length)]
x=length-1
string=car
list_of_results=[]
file1=file(name,"w")
while(x>-1):
result=""
if lista[x]==len(string)-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]=0
x-=1
elif x==length-1:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
else:
for z in xrange(length):
result+=string[lista[z]]
lista[x]+=1
if x>0:
x+=1
else:
x=length-1
#Escribiendo en el fichero
print result
file1.write(result+"\n")
toc = time.clock()
ttn = toc - tic
print ("Finalizado en "+str(ttn)+" segundos.");
print ("Revisa "+str(name)+" en tu directorio.");
#v2.0
¿has visto que el script tiene mezclado python 2.x y 3.x? ¿cómo lo ejecutás?
tenés las funciones de la barra en un módulo de clase, pues crea una instancia y después llamas a los atributos o funciones que necesitas.
Pero como lo harías tu? Sigue sin salirme, lo ejecuto con 2.7 y me funciona todo