10. Fonty a farby pre texty v grafike

Nastavenie fontu

Zatiaľ boli všetky naše vypísané texty do grafickej plochy veľmi maličké a je načase sa naučiť meniť veľkosť aj tvar písma. Z textových editorov už iste viete, že v textových dekumentoch môžete nastavovať, tzv. písmo (napr. Arial), jeho rez (napr. tučné, tzv. bold) a veľkosť (napr. 16). Zvykne sa tomuto hovoriť aj font. Pri vypisovaní textu do grafickej plochy môžeme zadať aj parameter font, ktorým určíme nielen meno písma, ale aj jeho veľkosť. Uvidíme,že pritom môžeme nastaviť aj rez (napr. bold alebo italic).

Meno písma závisí od oepračného systému (napr. MS Windows má inú sadu, ako Linux a MacOS) hoci existuje malá množina písiem, ktoré budú fungovať v rôznych operačných systémoch veľmi podobne. Vy si môžete vo svojich programoch zvoliť ľubovoľné meno písma, zatiaľ ale platí jedno dôležité obmedzenie: meno písma sa musí skladať len z jedného slova, preto nebude fungovať napr. 'Times New Roman'. My budeme pracovať s týmito menami písiem:

  • Arial

  • Courier

  • Times

  • Impact

Pre ilustráciu vypíšeme rovnaký text 'Programujem v Pythone' v rôznych fontoch:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_text(190, 30, text='Programujem v Pythone', font='Arial 22')
platno.create_text(190, 90, text='Programujem v Pythone', font='Courier 22')
platno.create_text(190, 150, text='Programujem v Pythone', font='Times 22')
platno.create_text(190, 210, text='Programujem v Pythone', font='Impact 22')

Vidíte rozdiely medzi týmito písmami:

_images/10_01.png

Veľkosť písma budeme väčšinou voliť podľa situácie, napr. ak chceme, aby sa nám text 'Python' zmestil celý do grafickej plochy, zvolíme:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_text(190, 130, text='Python', font='Arial 90')

a dostávame:

_images/10_02.png

Farba písma

Už sme sa naučili vyfarbovať vnútro obdĺžnikov ale aj ich obrys. Vieme, že farby sa najlepšie nastavujú pomocou ich mien a pre obdĺžniky sa to robí napr. takto:

platno.create_rectangle(50, 50, 250, 200, fill='red')

Pre farbu písma je to veľmi podobné: pomocou parametra fill môžeme nastaviť ľubovoľnú farbu vypisovaného textu. Napr. nasledovný program vypíše pod seba rovnaký text v rôznych farbách:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_text(190, 40, text='Programovanie', font='Arial 40', fill='blue')
platno.create_text(190, 120, text='Programovanie', font='Arial 40', fill='red')
platno.create_text(190, 200, text='Programovanie', font='Arial 40', fill='green')

dostávame:

_images/10_03.png

Zrejme bude veľmi závisieť od pozadia, na ktoré vypisujeme text s danou farbou. Predchádzajúci program doplníme o pozadie pre každý z textov:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

platno.create_rectangle(10, 10, 370, 70, fill='medium blue', width=0)
platno.create_text(190, 40, text='Programovanie', font='Arial 40', fill='blue')
platno.create_rectangle(10, 90, 370, 150, fill='orange red', width=0)
platno.create_text(190, 120, text='Programovanie', font='Arial 40', fill='red')
platno.create_rectangle(10, 170, 370, 230, fill='forest green', width=0)
platno.create_text(190, 200, text='Programovanie', font='Arial 40', fill='green')

a keďže sme úmyselne vybrali také farby, aby boli blízke k farbe textu, dostávame:

_images/10_04.png

Na tomto príklade vidíte, že niekedy úmyselne pod vypisované texty vkladáme obdĺžniky tak, aby sme zvýraznili nejaký text, alebo jeho časť.

Veľmi efektným je k danému textu vytváranie jeho tieňa. Napr. takéto tiene:

_images/10_05.png

vzniknú týmto programom:

import tkinter

platno = tkinter.Canvas(bg='white')
platno.pack()

x = 190
y = 60
platno.create_text(x+10, y-5, text='Python', font='Arial 60', fill='light gray')
platno.create_text(x, y, text='Python', font='Arial 60', fill='blue')
x = 190
y = 180
platno.create_text(x+8, y+4, text='Python', font='Times 70', fill='light gray')
platno.create_text(x, y, text='Python', font='Times 70', fill='green')

Dalo sa to aj bez premenných x a y, ale s nimi je to asi názornejšie, ako vznikli tieto tiene. Zrejme závisí na poradí v akom sa najprv nakreslí posunutý tieň a potom ten istý už zafarbený text.

Text v rámiku

Napíšeme podprogram karticka_nahodne, ktorý na náhodnú pozíciu napíše nejaký text, napr. 'Python', lenže tento text sa bude nachádzať vo farebnom obdlĺžniku. Použijeme ideu podprogramu stvorec_nahodne:

import tkinter
import random

platno = tkinter.Canvas(bg='white')
platno.pack()

def karticka_nahodne():
    x = random.randint(75, 300)
    y = random.randint(30, 210)
    platno.create_rectangle(x-75, y-30, x+75, y+30, fill='dodger blue')
    platno.create_text(x, y, text='Python', fill='yellow', font='Times 30')

karticka_nahodne()
karticka_nahodne()
karticka_nahodne()
karticka_nahodne()
karticka_nahodne()

Po spustení dostaneme:

_images/10_06.png

Asi si uvedomujete, že veľkosť rámika, resp. farebného obdĺžnika, bude závisieť od veľkosti textu a hlavne od veľkosti použitého písma.

Úlohy

  1. Do programu z predchádzajúcej časti, ktorý kreslil robota, dopíšte do všetkých podprogramov volania create_text tak, aby sa v každej časti robota objavil aj text, teda 'hlava', 'telo', 'lava ruka', 'prava ruka', 'lava noha', 'prava noha', napr.

    _images/10_07.png

  1. Napíšte program, ktorý zoberie nejaký konkrétny text (napr. báseň, alebo slová piesne) a vypíše ho do grafickej plochy tak, že riadky textu pritom rôzne zafarbíte. Napr.

    _images/10_08.png

  1. Navrhnite si vlastnú vizitku: zvoľte si farby obdĺžnika a textu, vyberte si nejaké zaujímavé písmo. Napr.

    _images/10_09.png

Zhrnutie

čo sme sa naučili:

  • do grafickej plochy môžeme okrem obdĺžnikov pomocou create_text zapisovať aj texty

  • ak chceme zmeniť veľkosť a tvar písma, musíme nastaviť parameter font

  • farbu textu nastavujeme parametrom fill