Seite 1 von 1

Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 06:55
von Alfons Mittelmeyer
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])

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 07:11
von Sirius3
@Alfons Mittelmeyer: hast Du schon in die Dokumentation geschaut?

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 07:16
von Alfons Mittelmeyer
@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?

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 07:19
von Sirius3
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))

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 07:25
von Alfons Mittelmeyer
@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")

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 07:51
von Alfons Mittelmeyer
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.

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 08:56
von cofi
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.

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 09:34
von Alfons Mittelmeyer
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()

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 09:54
von 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')

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 10:29
von Alfons Mittelmeyer
@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

Re: Variabel formatieren

Verfasst: Mittwoch 23. September 2015, 17:35
von Sirius3
@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)