Farben etc. in Kommandozeile?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
VoLANo

Samstag 20. September 2003, 10:22

Hallo!

Ich möchte der Übersicht halber Farben in mein Kommandozeilen-Tool einbauen. Gibt es da eine Möglichkeit?
Was auch noch nett wäre, wo ich mir aber (fast) sicher bin dass es nicht geht .. eine Art Progressbar, also am Anfang siehts so aus.
[----------]
und dann irgendwann:
[||||||||--]
falls das jemand versteht .. :D

Grüße, VoLANo
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Samstag 20. September 2003, 10:50

Hi VoLANo,

wenns für Unix/Linux sein soll, schau Dir mal curses an http://www.python.org/doc/current/lib/m ... urses.html


Dookie
Beyond
User
Beiträge: 227
Registriert: Freitag 6. September 2002, 19:06
Kontaktdaten:

Samstag 20. September 2003, 12:35

Oder benutze entsprechende Escape-Sequenzen!
Google mal danach.
Allerdings ist die Ausgabe dann relativ unrauchbar, um sie in Dateien zu loggen.
Daher habe das wieder aufgegeben.
(mit cat kann man natürlich die Ausgabe herstellen ...)

cu beyond
jocsch
User
Beiträge: 31
Registriert: Freitag 4. April 2003, 13:09
Wohnort: Egloffstein (Hundshaupten)

Montag 13. Oktober 2003, 10:03

Hallo!
Eine kleine Fortschrittsbalkenfunktion (ziemlich flexibel konfigurierbar) habe ich mal programmiert:

Code: Alles auswählen

#!/usr/lib/python
from sys import stdout

def showProgress(out, p, typ = 'bar', barlenght = 40, yop = '-', nop = '=', lt = '[', rt = ']'):
	if typ == 'percent':
		stdout.write('%3i%%\r' % (100 * p))
	elif typ == 'bar':
		l = int(barlenght * p)
		l0 = barlenght - l
		stdout.write(lt + yop * l + nop * l0 + rt + 
		'\r')
	elif typ == 'value':	
		stdout.write('%s\r' % p)
		
if __name__=='__main__':
	x = 100000
	for i in xrange(x+1):
		showProgress(stdout, float(i)/float(x), 'bar')
	print	
	print 'operation successfuly completed.'	
Einfach mal ausprobieren - immer dankbar für Kommentare!!!

Gruss, jocsch
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Montag 13. Oktober 2003, 12:37

Hallo,
an Fortschrittsbalken habe ich auch noch einen zu bieten, etwas mehr Funktionalität als bei jocsch, dafür aber auch viel mehr Code. ;-(

Zu beachten ist, daß eine korrekte Funktion von '\r' (Cursor auf den Zeilenanfang setzen) Voraussetzung ist. Das geht z.B. innerhalb von IDLE nicht.
Jörg

Code: Alles auswählen

import sys

class Spinner(list):
    """list that behaves like a ring buffer,
    next() gives the next element, starting over
    when done"""

    def __init__(self, *arg, **kwarg):
        list.__init__(self, *arg, **kwarg)
        self._index = -1

    def next(self):
        if self._index < (len(self)-2):
            self._index += 1
        else:
            self._index = 0
        return self[self._index]


class TxtScale:
    def __init__(self, width=40, template='[%s%c%s] % 10g |',
                 arrow='^', leftSign='-', rightSign='-',
                 minVal=0.0, maxVal=1.0):
        self.width = width
        self.template = template
        self.arrow = arrow
        self.leftSign = leftSign
        self.rightSign = rightSign
        self.minVal = minVal
        self.maxVal = maxVal

    def set(self, val, *args):
        v = max(min(val, self.maxVal), self.minVal)
        i = (int(round(self.width * (v - self.minVal)/(self.maxVal-self.minVal))) or 1) - 1
        j = self.width-i-1
        sys.stdout.write('\r')
        sys.stdout.write(self.template % ((self.leftSign*i, self.arrow,
                                           self.rightSign*j, val)+args))
        sys.stdout.flush()

    def clear(self):
        sys.stdout.write('\r')
        sys.stdout.flush()

if __name__ == '__main__':
    import time, math
    def test1():
        print "This is a scale:"
        s = TxtScale(10, minVal=-1.0, maxVal=1.0, template='<%s%c%s> x = % 10g')
        for i in range(100):
            s.set(math.sin(i/10.0))
            time.sleep(0.05)
        print

    def test2():
        print "This is a progress bar:"
        p = TxtScale(40, minVal=0.0, maxVal=100.0,
                     leftSign='#', arrow='#', rightSign=' ',
                     template= '|%s%c%s| % 3d%% | %s')
        for i in range(101):
            p.set(i, (i < 100) and 'Running' or 'Done   \n')
            time.sleep(0.05)

    def test3():
        print "This is a progress bar with a spinner:"
        p = TxtScale(40, minVal=0.0, maxVal=100.0,
                     leftSign='#', arrow='#', rightSign=' ',
                     template= '|%s%c%s| % 3d%% %c')
        x = Spinner('|/-\\')
        #x = Spinner(' .o0O0o.')
        for i in range(101):
            p.set(i, x.next())
            time.sleep(0.05)
        print
    test1()
    test2()
    test3()
"Sie sind nicht berechtigt, unrechtmäßige Kopien dieses Datenträgers zu erstellen." - Microsoft-Weisheit auf einer CD von MS-VisualC++-6.0
jocsch
User
Beiträge: 31
Registriert: Freitag 4. April 2003, 13:09
Wohnort: Egloffstein (Hundshaupten)

Montag 13. Oktober 2003, 15:10

Gut das!
Was haltet ihr denn von einer kleinen Fortschrittsbalken - Hall of fame ... ?

gruesse jocsch
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Dienstag 14. Oktober 2003, 11:11

jocsch hat geschrieben:Gut das!
Was haltet ihr denn von einer kleinen Fortschrittsbalken - Hall of fame ...
Oh, das ist bestimmt spaßig. Irgendwann gibt es dann ASCII-Art-Häschen, die von links nach rechts hoppeln, und dazu rechts einen Igel, die einen dummen Spruch macht (Fortschrittsbalken mit Sound), oder so ähnlich. ;-)

Grüße!
Jörg
"Sie sind nicht berechtigt, unrechtmäßige Kopien dieses Datenträgers zu erstellen." - Microsoft-Weisheit auf einer CD von MS-VisualC++-6.0
Antworten