2017-05-19 4 views
0

Ich bin ein "Anfänger" Python-Benutzer.Python Tkinter Listbox Eingabeformat

Ich habe eine Listbox tkinter mit und ich möchte die Listeneinträge zu formatieren, so dass sie ausgerichtet sind, und ich habe folgendes:

from Tkinter import * 
master = Tk() 

info=[ ['sue', 1, 'Argentina', 'Bsc'], 
    ['peggy-sue', 17, 'U.K.', 'Bsc'], 
    ['susie', 234, 'France', 'BA'] 
] 

listbox = Listbox(master, width=60) 
listbox.pack() 

listbox.insert(END, "{:<15s} {:>5s} {:<25s} {:<5s}".format("Name","id","Nationality","Qual")) 

for i in range(len(info)): 
    item = "{:<15s} {:>5d} {:<25s} {:<5s}".format(info[i][0],info[i][1],info[i][2],info[i][3]) 
    print item # Gives nicely formatted lines 
    listbox.insert(END, item) #Lines are not nicely formatted in listbox 

mainloop() 

Kann mir jemand erklären, warum die listbox Einträge sind schön nicht als Druck formatiert Linie ist?

Ich weiß über mehrspaltige Listboxen (z. B. Display Listbox with columns using Tkinter?) und so brauche ich keine Lösung, ich bin daran interessiert, warum die Dinge nicht so funktionieren, wie ich es erwartet hatte.

Dank

+0

Sie müssen Ändern Sie die Anzahl der Leerzeichen zwischen den Elementen in Abhängigkeit von der Länge jedes Elements. Ich werde sehen, ob ich es schaffen kann, aber das sollte ziemlich einfach zu erreichen sein. – pointerless

Antwort

2

Ihre Standardschriftart gleiche Breiten nicht für Zeichen verwendet werden. Versuchen Sie zum Beispiel (vorausgesetzt, Sie sind auf Windows):

listbox = Listbox(master, width=60, font='consolas') 

Daraus ergibt sich folgendes:

TKinter window using Consolas, with equal spacing

+0

Danke, das beantwortet meine Frage. Ich bin auf Linux, wo font = 'mono' funktioniert – TCJUK

+0

@TCJUK froh, es zu hören, und ich werde 'mono' für Linux in Zukunft behalten! Sie können dies als Antwort auf Ihre Frage markieren, indem Sie auf das Häkchen links neben der Antwort klicken! – asongtoruin

0

Nicht so gut wie @asongtoruin aber

from Tkinter import * 
master = Tk() 

info=[ ['sue', 1, 'Argentina', 'Bsc'], 
     ['peggy-sue', 17, 'U.K.', 'Bsc'], 
     ['susie', 234, 'France', 'BA'] 
] 

heads = ["Name","id","Nationality","Qual"] 
listbox = Listbox(master, width=60) 
listbox.pack() 
fixedlen = 10 
listbox.insert(END, ("{:<15s}"+(fixedlen-len(heads[0]))*" " +"{:>5s}"+(fixedlen-len(heads[1]))*" " +"{:<25s}"+(fixedlen-len(heads[2]))*" " +"{:<5s}").format(heads[0],heads[1],heads[2],heads[3])) 

for i in range(len(info)): 
    item = ("{:<15s}"+(fixedlen-len(str(info[i][0])))*" " +"{:>5d}"+(fixedlen-len(str(info[i][1])))*" " +"{:<25s}"+(fixedlen-len(str(info[i][2])))*" " +"{:<5s}").format(info[i][0],info[i][1],info[i][2],info[i][3]) 
    print item # Gives nicely formatted lines 
    listbox.insert(END, item) #Lines are not nicely formatted in listbox 

mainloop()