string.center()

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
StitZle
User
Beiträge: 7
Registriert: Dienstag 26. Juni 2018, 15:26

Hallo,

ich möchte gerne einen String centern.
Jedoch soll jeder Buchstabe nach einander und hintereinander Ausgegeben werden.
Also Hallo : H (pause) a (pause) l (pause) l (pause) o.

Dazu habe ich folgende Funktion geschrieben:

Code: Alles auswählen

import sys, time 


def text_typer(string, delay) :

  size = 40

  word_lenght = len(string) 
  size = int(size) + word_lenght
  
  for letter in string:

    sys.stdout.write(letter.center(size))
    sys.stdout.flush()
    time.sleep(delay)
    size = 0



text_typer ("Hallo", 0.03)
Dies ergibt folgenden Output :

Code: Alles auswählen

                         H                         allo

Erstetzt man nun

Code: Alles auswählen

letter.center(size)
mit

Code: Alles auswählen

letter.rjust(size)
stimmt der Output.

Das

Code: Alles auswählen

size  = 0
steht dort damit nach dem ersten Buchstaben direkt weitergeschrieben wird.

Das ist mein erstes Problem. Den ich würde gerne mit der center() Methode arbeiten anstatt mit der .rjsut()

Zudem ist mein zweites Problem das ich keine neue Line ausgeben kann. Also lautet der Befehl :

Code: Alles auswählen

text_typer ("Hallo\nHallo",0.03)
sieht der Output so aus :

Code: Alles auswählen

  
                                                  Hallo
Hallo   

Das möchte ich natürlich nicht.

Mein Lösungsanatz war den ganzen String in eine Liste zu spliten und dann das erste Wort aus zu geben.
Dannch sollte ein If kommen in dem gecheckt wird ob das nächste Wort "\n" ist das sollte dann mit print ("\n") ausgegeben werden.
Wenn nicht dann einfach wieder Buchstabe für Buchstabe.

Jedoch bekomme ich das "\n" nicht in eine liste mit string.split

Ich hoffe jemand kann mir helfen.

Niclas
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Zum ersten Problem: Du darfst eben nicht center benutzen, denn das füllte den String auch rechts mit Leerzeichen. Du kannst ja ausrechen, wie viele Leerzeichen Du links ausgeben mußt. Zum zweiten Punkt verstehe ich nicht, wo das Problem ist. Wenn Du eine Liste mit Zeilen hast, dann kommt darin ja kein Zeileendezeichen mehr vor.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

string.center hilft dir nicht. Das packt dein Zeichen ja von beiden Seiten ein. Stattdessen musst du bestimmen, wieviele Leerzeichen zwischen jeden Buchstaben müssen. Das sind (breite - Länge)/Länge viele. Das doofe: das kann eine gebrochene Zahl sein. Es gibt verschiedene Möglichkeiten das zu lösen. Zb kann man mit

spaces = math.floor((breite - länge)/länge)
rest = breite - spaces * länge

die Anzahl dieser fehlenden Spaces berechnen. Und die dann zb einfach auf die Zwischenräume verteilen. Eine Alternative ist der bresenham Algorithmus.

Zu deinem newline-Problem: so machst du es dir unnötig schwer. Stattdessen einfach den String an newlines aufteilen, jeden teilstring zentrieren, und dann alle mit Newlines dazwischen wieder ausgeben.
StitZle
User
Beiträge: 7
Registriert: Dienstag 26. Juni 2018, 15:26

Hallo,

erstmal danke für die schnellen Antworten.

Ich konnte das Problem jetzt lösen.

Jedoch stimmt mein Output immer noch nicht ganz.

Code: Alles auswählen

import sys, time 


def text_typer(string, delay) :


  liste = string.splitlines()
  word = liste[0]

  while len(liste) > 0 :
    
    size = 40
    
    for letter in liste[0] :
      sys.stdout.write(letter.rjust(size))
      sys.stdout.flush()
      time.sleep(delay)
      size = 0
    liste.remove(liste[0])
    print ("\n")



text_typer ("Hallo\nDies ist ein Test\n123", 0.03)
Ergibt volgenden Output:

Code: Alles auswählen

                                       Hallo

                                       Dies ist ein Test

                                       123


Jedoch sollte der Output so aussehen:

Code: Alles auswählen

  
                                    Hallo
                                    Dies ist ein Test
                                    123


Das Problem mit der Zentrirung gehe ich später an.

Vielleicht habt ihr ja nochmal einen Vorschlag.


Niclas
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`word` wird nicht verwendet und das ``while`` sollte einfach eine ``for``-Schleife über `liste` sein. Und dann überlege mal wie viele Zeilenenden ``print('\n')`` ausgibt.

Das mit `size` und `rjust()` ist auch reichlich sinnlos. Einfach *vor* der inneren Schleife 40 Leerzeichen ausgeben hätte den gleichen Effekt und wäre weniger umständlich ausgedrückt.

Edit:

Code: Alles auswählen

import sys
import time


def text_typer(string, delay):
    for line in string.splitlines():
        print(' ' * 40, end='')
        for character in line:
            sys.stdout.write(character)
            sys.stdout.flush()
            time.sleep(delay)
        print()


def main():
    text_typer('Hallo\nDies ist ein Test\n123', 0.03)


if __name__ == '__main__':
    main()
Und jetzt kannst Du Dir überlegen was statt ``* 40`` da stehen müsste um die Zeile zu zentrieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten