Tkinter - Textový editor (1. část)
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Tkinter - Textový editor (1. část)Tkinter - Textový editor (1. část)

 

Tkinter - Textový editor (1. část)

Google       Google       23. 6. 2007       13 147×

Podíváme se na udělátka Text a Menu a vytvoříme primitivní textový editor.

Reklama
Reklama

Dnes si ukážeme, jak vytvořit jednoduchý textový editor. Nebude to umět žádné závratné funkce, bude nám stačit, když si ukážeme, jak uložit, otevřít dokument. V dalším díle bychom se podívali na nastavení jako barva a velikost textu. Jak jsem tedy již naznačil, celá lekce bude o udělátku Text a Menu.

Použité metody

Než se naučíme potřebné metody, měli bychom si něco říci o způsobu indexování v udělátku Text.

  • Indexy jsou zpravidla dvě čísla oddělená tečkou: 1.5. První číslo značí řádek a druhé znak na řádku. Takže první písmeno bude mít index 1.0.
  • Další způsob, velmi podobný prvnímu, je indexování ve tvaru "radek.end". Slouží to k získání posledního znaku na nějaké řádce. Takže poslední znak na první řádce bude 1.end.
  • END - speciální proměnná označující poslední znak v udělátku.
  • INSERT – tento index bude mít vždy polohou vkládacího kurzoru.
  • Existují i další a o těch si případně řekneme v dalších lekcích.

text.get(start, konec)

Získá obsah udělátka Text mezi indexem start a konec. Obsah celého udělátka se tedy získá:

text.get(1.0,END)

text.delete(start, konec)

Smaže část textu mezi indexem start a konec. Takže první řádek by se smazal jako:

text.delete(1.0,"1.end")

text.index(index)

Získá index ve tvaru řádek.znak. Parametr index může obsah proměnné jako END a INSERT. Takže chceme-li získat číselnou hodnotu posledního znaku, musíme použít:

text.index(END)

Pomocné moduly

PIL

Standardně umí Tkinter pracovat pouze s obrázky ve tvaru GIF a my pomocí tohoto modulu použijeme obrázky PNG. Z modulu PIL budeme potřebovat moduly Image a ImageTk:


import Image, ImageTk
obrazek=Image.open("slunicko.png")
obrazek=ImageTk.PhotoImage(obrazek) 

tkFileDialog

Náš editor bude po uživateli občas chtít, aby zadal cestu k uložení nebo otevření souboru. Bylo by nepraktické nechávat ho zadávat celou cestu ručně, takže použijeme modul tkFileDialog. My z tohoto modulu použijeme funkce askopenfilename a asksaveasfilename. Jejich funkci snadno pochopíte z malé ukázky:

# -*- coding: cp1250 -*-
import tkFileDialog
cesta=tkFileDialog.askopenfilename(title='Vyberte soubor')
print "Otevírám soubor: ",cesta

Samotný program

Takže musíme začít úvahou, co náš editor bude umět. Měl by umět hlavně otevřít, uložit a vytvořit soubor. To nám bude v dnešní lekci stačit. Nahoře bude menu, pod ním lišta a pak už samotný editor. Takže si načrtneme, jak bude vypadat naše třída:

# -*- coding: utf-8 -*-
from Tkinter import*
class Editor:
    def __init__(self):
        self.obrazky=[]
        "vytvoření uživatelského rozhraní."
    def otevrit(self):
        "získa od uživatele jmeno souboru a otevře ho."
    def ulozit(self):
        "uloží právě otevřený dokument."
    def novy_soubor(self):
        "vytvoří nový soubor."

Menu

Pro vytvoření menu použijeme udělátko Menu.

hlavniMenu = Menu(self.okno)
menuSoubor = Menu(hlavniMenu, tearoff=0)
menuSoubor.add_command(label="Nový soubor")
menuSoubor.add_command(label="Otevřít")
menuSoubor.add_command(label="Uložit")
menuSoubor.add_command(label="Konec")
hlavniMenu.add_cascade(label="Soubor", menu=menuSoubor)
okno.config(menu=hlavniMenu)

Zbývá přiřadit jednotlivým tlačítkům funkci. Ta se přiřazuje pomocí parametru command.

Lišta

Lišta vlastně bude jenom rámec (frame) umístěný úplně nahoře. Šířka lišty se musí přizpůsobovat šířce okna a výška lišty se musí přizpůsobit výškám tlačítek. Takže to bude vypadat nějak takto:

self.lista=Frame(self.okno)
self.lista.pack(fill=X) 
Button(self.lista,image=self.vrat_obrazek("save.png"),command=self.ulozit).pack(side=LEFT,fill=Y)

Tlačítka v liště obvykle nemívají žádný popisek, takže i my nepoužijeme text, ale obrázek. A abychom nemuseli každý obrázek, co umisťujeme v liště, otevírat samostatně, použijeme funkci vrat_obrazek:

def vrat_obrazek(self, cesta):
    obr=Image.open(cesta)
    obr=ImageTk.PhotoImage(obr)
    self.obrazky.append(obr)
    self.okno.image=self.obrazky
    return obr

Podobným způsobem doděláme další tlačítka do lišty. Samozřejmě každý obrázek musíme přidat do seznamu self.obrazky, aby se každá instance uchovala. Obrázky, co jsem použil já, se dají stáhnout zde: close.png, save.png, open.png, new.png.

Editor

Nyní nám zbývá dodělat samostatný editor. Jak jsem již v úvodu naznačil, použijeme udělátko Text:

self.text=Text(self.okno)
self.text.pack(fill=BOTH,expand=1)#aby se nám Text roztáhnul přes celé okno.

Když takto vytvoříme Text, nevytvoří se posuvníky. Ale to není překážka, protože si je vytvoříme sami:

obal=Frame(self.okno)
obal.pack(fill=BOTH,expand=1)
posuvnikY=Scrollbar(obal)
posuvnikY.pack(side=RIGHT,fill=Y)
posuvnikX=Scrollbar(obal, orient=HORIZONTAL)
posuvnikX.pack(fill=X,side=BOTTOM)
self.text=Text(obal,yscrollcommand=posuvnikY.set,xscrollcommand=posuvnikX.set,wrap=NONE)
self.text.pack(fill=BOTH,expand=1)
self.text.focus_set()
posuvnikX["command"]=self.text.xview
posuvnikY["command"]=self.text.yview

Standardně by se text zalomoval, ale s použitím parametru wrap mu v tom zabráníme. self.text.focus_set() zajistí, že ihned po zapnutí bude text focus. Tím pádem máme uživatelské rozhraní a můžeme přikročit k napsání ostatních funkcí.

Otevřít

Pro získání souboru, co chce uživatel otevřít, musíme použít modul, který jsme si představili na začátku. Poté ho otevřeme a jeho obsah vložíme pomocí funkce insert do editoru:

cesta=tkFileDialog.askopenfilename(title=u"Otevřít...")
if cesta:
    self.text.delete(1.0,END)
    soubor=file(cesta,'r')
    self.text.insert(END,soubor.read())
    soubor.close()

Část if cesta je tam proto, že když uživatel zavře dialog otevírání souboru, tak proměnná cesta bude mít hodnotu None a potom by otevření souboru vyvolalo výjimku.

Uložit

Kód bude v podstatě stejný jako funkce otevrit až na to, že místo askopenfilename použijeme asksaveasfilename a místo čtení souboru do něj budeme zapisovat:

cesta=tkFileDialog.asksaveasfilename(title=u"Uložit jako...")
if cesta:
    soubor=file(cesta,'w')
    soubor.write(self.text.get(1.0,END))
    soubor.close()

Nový dokument

V této funkci pouze vymažeme celý obsah udělátka.


Co dál?

Nemyslete si, že toto je všechno, co se dá s udělátkem Text dělat. V dalším díle se naučíme používat tagy a vyskakovací menu.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Autor studuje na FIT ČVUT a je šéfredaktorem portálu Matematika pro každého.
Web    

Nové články

Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Reklama
Reklama
Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý