blog.furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

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()

tkinter-pack

tkinter-grid

Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury