Wyrównywanie widgetów, tekstów na widgecie i linii w tekscie w Tkinter
To jest „przedruk” mojej wypowiedzi na polskim forum Pythona http://pl.python.org/forum/index.php?topic=4366.msg18709#msg18709
--
Wyrównywanie elementów do prawej i lewej
Sposób wyrównywania zależy od użytego układu - pack, grid.
Po pierwsze: w przypadku Label (które domyślnie nie wyświetla ramki) nie
widać, że Label nie zajmuje całej "komórki" w grid
i pack
.
Trzeba by zadać ramkę Labelowi ale ja w przykładach posłużę się
Buttonem.
Aby przesunąć przycisk do prawej lub lewej strony należy odpowiedni
parametr podać w grid()
lub pack()
. Dla każdego z nich jest on
inaczej nazwany pack(anchor='w')
, grid(sticky='w')
.
Podobnie jest z rozciągnięciem elementu na całą komórkę:
pack(fill='x')
, grid(sticky='we')
. Oprócz tego jest też
możliwość przesuwania w prawo i lewo napisu na Buttonie/Labelu. Tutaj
jednak robi się to jednakowo - podająć anchor='w'
w Buttonie/Labelu
- Label( ... anchor='w')
.
Tak więc przesunąłeś napis do prawej wewnątrz Label ale sam Label zamował minimalną przestrzeń centralnie w komórce więc nie było widać róznicy. Tak więc należy albo przesunąć cały Label w bok, albo rozszerzyć Label na całą komórkę i wtedy przesunąć napis w bok.
Do tego wszystkiego dochodzi trzecie przesuwanie - wyrównywanie względem
siebie kilku linijek tekstu w Label/Button Uśmiech W napisie można użyć
"\n" aby otrzymać kilka wierszy tekstu ale domyślnie są one wyrównane
centralni. Za pomocą justify='left'
można wiersze wyrównać do lewej
względem siebie ale tekst jako całość wciąż pozostaje centralnie na
Labelu/Buttonie Label(... text=" jeden \\n dwa ", justify="left")
Poniżej przykładowe programy pokazujące różne wyrównania. Lepiej to wygląda po uruchomieni niż podczas przeglądania kodu.
Dodakowo zamiast napisów 'w', 'e', 'left', 'right', 'center' można stosować stałe W, E, LEFT, RIGHT, CENTER. Dla 'we' mamy sumę stałych W+E.
W identyczny sposób można wyrównywać w pionie korzystając z 'n' i 's' (north, south).
dla pack()
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from Tkinter import *
master = Tk()
master.title('Pack')
Label(master, text="Baaaaaaaardzo długi napis aby okno zrobiło się baaaaaaaardzo szerokie").pack()
Button(master, text="(nic)\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack()
Label(master, text="\n--- wyrównywanie przycisku w komórce ---\n").pack()
Button(master, text="anchor='w'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack(anchor='w')
Button(master, text="anchor=W\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack(anchor=W)
Button(master, text="anchor='e'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack(anchor='e')
Button(master, text="anchor=E\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack(anchor=E)
Label(master, text="\n--- wyrównywanie napisu w przycisku ---\n").pack()
Button(master, text="fill='x'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack(fill='x')
Button(master, text="fill=X\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").pack(fill=X)
Button(master, text="fill='x'\nanchor='w'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor='w').pack(fill='x')
Button(master, text="fill=X\nanchor=W\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor=W).pack(fill=X)
Button(master, text="fill='x'\nanchor='e'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor='e').pack(fill='x')
Button(master, text="fill=X\nanchor=E\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor=E).pack(fill=X)
Label(master, text="\n--- wyrównywanie lini w napisie ---\n").pack()
Button(master, text="fill='x'\njustify='left'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify='left').pack(fill='x')
Button(master, text="fill=X\njustify=LEFT\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify=LEFT).pack(fill='x')
Button(master, text="fill='x'\njustify='right'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify='right').pack(fill='x')
Button(master, text="fill=X\njustify=RIGHT\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify=RIGHT).pack(fill='x')
Button(master, text="fill='x'\njustify='center'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify='center').pack(fill='x')
Button(master, text="fill=X\njustify=CENTER\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify=CENTER).pack(fill='x')
master.mainloop()
dla grid()
#!/usr/bin/env python
#-*- coding: utf-8 -*-
from Tkinter import *
master = Tk()
master.title('Grid')
Label(master, text="Baaaaaaaardzo długi napis aby okno zrobiło się baaaaaaaardzo szerokie").grid()
Button(master, text="(nic)\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid()
Label(master, text="\n--- wyrównywanie przycisku w komórce ---\n").grid()
Button(master, text="sticky='w'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid(sticky='w')
Button(master, text="sticky=W\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid(sticky=W)
Button(master, text="sticky='e'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid(sticky='e')
Button(master, text="sticky=E\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid(sticky=E)
Label(master, text="\n--- wyrównywanie napisu w przycisku ---\n").grid()
Button(master, text="sticky='we'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid(sticky='we')
Button(master, text="sticky=W+E\nxxxxxxxxxxxxxxxxxxxxxxxxxxx").grid(sticky=W+E)
Button(master, text="sticky='we'\nanchor='w'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor='w').grid(sticky='we')
Button(master, text="sticky=W+E\nanchor=W\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor=W).grid(sticky=W+E)
Button(master, text="sticky='we'\nanchor='e'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor='e').grid(sticky='we')
Button(master, text="sticky=W+E\nanchor=E\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", anchor=W).grid(sticky=W+E)
Label(master, text="\n--- wyrównywanie lini w napisie ---\n").grid()
Button(master, text="sticky='we'\njustify='left'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify='left').grid(sticky='we')
Button(master, text="sticky=W+E\njustify=LEFT\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify=LEFT).grid(sticky=W+E)
Button(master, text="sticky='we'\njustify='right'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify='right').grid(sticky='we')
Button(master, text="sticky=W+E\njustify=RIGHT\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify=RIGHT).grid(sticky=W+E)
Button(master, text="sticky='we'\njustify='center'\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify='center').grid(sticky='we')
Button(master, text="sticky=W+E\njustify=CENTER\nxxxxxxxxxxxxxxxxxxxxxxxxxxx", justify=CENTER).grid(sticky=W+E)
master.mainloop()
