2016-03-21 7 views
3

Ich möchte eine Message-Box in Python, die den verketteten String-Text zeigt. Ich möchte, dass der Text linksbündig ausgerichtet ist, aber nicht. Ich versuchte ljust() und {:<14} usw. Aber es immer noch nicht ausgerichtet.String-Ausrichtung in Tkinter

Es scheint wie folgt aus:

enter image description here

Der Code Stück unten ist,

for todo_item in resp.json()['SectorList']: 
    sector_id +='Sector Id: {:<14}'.format(todo_item['SectorId']) + '\n' 
    sector_name += 'Sector Name: {:<40}'.format(todo_item['SectorName']) + '\n' 

Nach der Schleife ich diese Texte in meine Message-Box hinzuzufügen.

label_id = tkinter.Label(f, anchor = tkinter.W, text = sector_id) 
label_name= tkinter.Label(f,anchor = tkinter.W, text = sector_name) 

label_id.grid(row= 2, column = 1, sticky = tkinter.W) 
label_name.grid(row= 2, column = 2, sticky = tkinter.W) 

Sektor-ID-Teil ist in Ordnung, aber Sektorname ist nicht linksbündig. Irgendeine Idee?

+0

Dies ist ein Problem mit nicht-Längeneinheit Schriftart . Nicht mit dem Code selbst – AlanSTACK

+0

Danke @Alan. Haben Sie eine Idee, wie Sie das Schriftartenproblem lösen können, wie es in der Einheitslänge gemacht wird? – Hilal

+0

Ich habe eine ausführlichere Antwort unten zur Verfügung gestellt, wie man es macht. – AlanSTACK

Antwort

1

Es gibt kein Problem mit Ihrem Code.

Das Problem liegt in der Tatsache, dass Sie nicht-Einheitslänge non-monospace Schriftart verwenden, wo die Zeichen nicht die gleiche Menge an Speicherplatz einnehmen.

Dies kann es etwas für die Ausrichtung wie

label_id = tkinter.Label(f, anchor=tkinter.W, text=sector_id, font=('Consolas', 15)) 
label_name = tkinter.Label(f, anchor=tkinter.W, text=sector_name, font=('Consolas', 15)) 
+0

Ausgezeichnet es funktioniert! Danke vielmals. Für Python 3 funktioniert der Import von tkFont nicht. Es muss tkinter.font importiert werden. Aber ohne sie, wenn ich den Font-Namen direkt benutze (ohne tkFont.Font (Family = 'Consolas' bla bla)), funktioniert es. Danke noch einmal ! – Hilal

4

Unter Berufung auf Schriftarten ist eine schlechte Praxis wäre durch die Umstellung auf eine monospace Schriftart wie consolas

import tkFont 

my_font = tkFont.Font(family='Consolas', size=15, weight='bold') 

# then plug in the font to your widget ... 

so im Code festgelegt werden; Wie erwähnt, es funktioniert nur mit Monospaces Schriftarten, aber tun Sie wirklich wollen Monospaces Schriftarten in Ihrer gesamten Anwendung verwenden nur für die Ausrichtung? Ich weiß nicht. Und was, wenn Sie später einen Label zu einem Input oder etwas anderem ändern möchten? Müssen wir jetzt neue Label s nur zur Ausrichtung hinzufügen?

Also während der Wechsel zu einer monospaced Schriftart "funktioniert", wäre ein (viel) besser Weg, die Werkzeuge zu verwenden, die Tk uns zur Verfügung stellt.

Zum Beispiel können Sie die Label() in der ersten Spalte auf eine feste Breite eingestellt:

import tkinter 

# Just some random strings of different sizes from my dictionary 
names = ['Algol', 'American', 'Americanises', 'Americanising', 'Americanism', 
    'Argentine', 'Argentinian', 'Ariz', 'Arizona', 'Armstrong'] 

root = tkinter.Tk() 
tkinter.Label(root, text='Lists:', anchor=tkinter.W).grid(row=0, column=0, sticky=tkinter.W) 
for i in range(0, 10): 
    label_id = tkinter.Label(root, width=30, anchor=tkinter.W, text='Sector %s' % i) 
    label_name = tkinter.Label(root, anchor=tkinter.W, text=names[i]) 

    label_id.grid(row=i+1, column=0, sticky=tkinter.W) 
    label_name.grid(row=i+1, column=1, sticky=tkinter.W) 

root.mainloop() 

Es gibt mehr Möglichkeiten, dies zu tun, aber. Zum Beispiel durch eine Breite mit columnconfigure Einstellung:

import tkinter 

# Just some random strings of different sizes from my dictionary 
names = ['Algol', 'American', 'Americanises', 'Americanising', 'Americanism', 
    'Argentine', 'Argentinian', 'Ariz', 'Arizona', 'Armstrong'] 

root = tkinter.Tk() 
root.columnconfigure(0, minsize=150) 
tkinter.Label(root, text='Lists:', anchor=tkinter.W).grid(row=0, column=0, sticky=tkinter.W) 
for i in range(0, 10): 
    label_id = tkinter.Label(root, anchor=tkinter.W, text='Sector %s' % i) 
    label_name = tkinter.Label(root, anchor=tkinter.W, text=names[i]) 

    label_id.grid(row=i+1, column=0, sticky=tkinter.W) 
    label_name.grid(row=i+1, column=1, sticky=tkinter.W) 

root.mainloop() 

Der Vorteil columnconfigure() besteht darin, dass die minimale Breite des Spalts Inhalts unabhängig ist. Also, wenn Sie die Label() zu etwas später ändern, sollte das Layout noch funktionieren, und es ist wahrscheinlich ein wenig offensichtlicher, dass Sie explizit eine Breite für diese Spalte festlegen möchten.

+0

Ich habe eine Anwendung mit einem Raster von Schaltflächen mit Python2.66. Die Breite (wenn ich es verstehe) wird in der Anzahl von Zeichen angegeben, wenn der Text Zeichen enthält, und in Pixeln, wenn ein Bild verwendet wird. Wie funktioniert es, wenn die Zeichen keine feste Breite haben? – Marichyasana

+0

@Marichyasana Die Breite des 'Labels' ist tatsächlich in Texteinheiten; Ich bin mir nicht ganz sicher, was Tk intern als "text unit" verwendet, aber es spielt keine Rolle Eine "text unit" ist eine feste Anzahl von Pixeln, auch wenn Sie eine proportionale Schriftart verwenden. Diese Größe ist proportional zur Schriftgröße, die als nützlich angesehen werden kann (da der Abstand zunimmt, wenn Sie die Textgröße ändern) ... Es ist wie "em" in CSS. – Carpetsmoker

+0

Danke, das funktioniert auch gut. Und danke für die Erklärung und nützliche Informationen. – Hilal

3

Sie benötigen eine Schriftart mit fester Breite, damit dieser Ansatz funktioniert.

Für jede Plattform bietet TkInter Standardschriftarten, einschließlich "TkFixedFont".Dies sollte entspricht eine anständige (und verfügbar) Breite Schrift für die aktuelle Plattform festgelegt, so ist die folgend eine einfache und tragbare Art und Weise eine Schrift mit fester Breite zu erhalten:

label_id = tkinter.Label(f, anchor=tkinter.W, text=sector_id, font='TkFixedFont')