Ayuda con python (Barras de progreso).

Iniciado por aalleexx, 8 Diciembre 2015, 23:35 PM

0 Miembros y 1 Visitante están viendo este tema.

aalleexx

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");

tincopasan

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

aalleexx

#2
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

aalleexx

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

aalleexx

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

tincopasan

¿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.

aalleexx

#6
Pero como lo harías tu? Sigue sin salirme, lo ejecuto con 2.7 y me funciona todo