Variabel formatieren

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
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Ich habe diesen Ausdruck gefunden: '{:<30}'.format('left aligned')

Ich bräuchte das aber so:

def width_print(wid,par):
print('{:<wid}'.format(par))

Irgendwo geht doch sicher auch eine variable Breite, ohne das so zu machen:

Code: Alles auswählen

def width_print(wid,par):
    print((par+"                                                                      ")[0:wid])
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: hast Du schon in die Dokumentation geschaut?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3 Habe ich schon geschaut. Schaut aber so kompliziert aus. Vielleicht mache ich es dann so:

Code: Alles auswählen

print((par+" "*(width-len(par)))[0:width])
Ob das aber den Style guides entspricht?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann hast Du nicht gründlich genug gelesen:

Code: Alles auswählen

def width_print(wid,par):
    print('{par:<{wid}}'.format(par=par, wid=wid))
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@Sirius3 Hat aber nicht funktioniert:

Code: Alles auswählen

print('{par:<{wid}}'.format(par="Das ist ein Test", wid=5))
Hat es nicht abgeschnitten.
Und wenn man es dann so macht, das schaut noch komplizierter aus als mein Ausdruck:

Code: Alles auswählen

print(('{par:<{wid}}'.format(par="Das ist ein Test", wid=5))[0:5])
Noch eine Frage. Ist das ein Problem, wenn etwas so aussieht, natürlich die -1 nicht hart kodiert:

Code: Alles auswählen

print("test"+"A"*-1+"Test2")
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Das ist eigentlich, was ich bräuchte:

Code: Alles auswählen

par_width = myWidget['width'] - 1 - info_len
line = (par + " "*(par_width - len(par)))[0:par_width] + "|" + info
Wenn es dafür einen schönen Format Ausdruck gäbe. Aber damit kenne ich mich nicht so gut aus.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

width is a decimal integer defining the minimum field width.
Die Modifier kuemmern sich um das Padding, das sind keine absoluten Feldbegrenzer. Da musst du dann selbst abschneiden.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Dann lohnt sich dieser Formatstring hier gar nicht. Hab ich es eben so gemacht:

Code: Alles auswählen

import tkinter as tk

root = tk.Tk()

DIR_TYPE = 0
DEVICE_ROOT = (("Documents",DIR_TYPE),("Music",DIR_TYPE),("Pictures",DIR_TYPE),("Videos",DIR_TYPE))

list_box = tk.Listbox(root,font='TkFixedFont',selectmode='extended')
list_box.pack(side='right')

def fill_line(widget,par,info,info_len):
    par_width = widget['width'] - 1 - info_len
    return (par + " "*(par_width - len(par)))[0:par_width] + "|" + info

def fill_dir(dir_list=DEVICE_ROOT,lb=list_box,first="/"):
    lb.delete(0,'end')
    lb.insert('end',fill_line(lb,first,first,3))
    for entry in dir_list:
        lb.insert('end',fill_line(lb,entry[0],'DIR' if entry[1] == DIR_TYPE else '',3))

fill_dir()

root.mainloop()
BlackJack

Wieso lohnt sich der Formatstring nicht? Es ist damit kürzer und einfacher. Leichter zu verstehen IMHO auch. Ansonsten sollte man `ljust()` verwenden statt sich das selber nachzubasteln:

Code: Alles auswählen

In [15]: '{0:<{1}}|{2}'.format(par[:par_width], par_width, info)
Out[15]: 'parr|dead'

In [16]: '{0}|{1}'.format(par[:par_width].ljust(par_width), info)
Out[16]: 'parr|dead'

In [17]: par, par_width, info
Out[17]: ('parrot', 4, 'dead')
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@BlackJack Das mit ljust ist gut und auch am Kürzesten, wenn man das format einfach weglässt:

Code: Alles auswählen

par[:par_width].ljust(par_width) +"|"+info
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Alfons Mittelmeyer: Du bist ein hoffnungsloser Fall. Aber hier ist das, was Du wolltest:

Code: Alles auswählen

'{0:{1}.{1}}|{2}'.format(par, par_width, info)
Antworten