5. diel - Aplikácie Čítačka Kníh v Kivy a Pythone
Zdravím vás u ďalšej lekcie Pythone a frameworku Kivy. V tej minulej,
Reakcia na kliknutie / dotyk a aplikácie Maľovanie v Kivy , sme si vytvorili jednoduché Maľovanie, predstavili sme si grafiku
na canvas
a reakciu na kliknutie a pohyb myši alebo dotyk. V
dnešnej lekcii si ukážeme ako používať PageLayout
a
vytvoríme si aplikáciu Čítačka kníh.
Túto aplikáciu už budem písať iba v Pythone, pretože osobne nie som
fanda Kivy language. Keď v Pythone pridávame widget do widgetu / layoutu,
použijeme funkciu muj_widget.add_widget(muj_widget_cislo2)
. Aký
spôsob zvolíte vy záleží na vás.
PageLayout
Najskôr si ukážeme ako funguje PageLayout
. Jedná sa o layout
ako BoxLayout
, ale widgety sú rozdelené na jednotlivé stránky
ako v knihe. Pre ukážku si na začiatok vytvoríme jednoduchú aplikáciu.
Najskôr si musíme importovať samotný PageLayout
a
Label
pre zobrazenie textu na samotnej stránke, potom si
importujeme Color
a Rectangle
z grafiky a nakoniec
App
pre spustenie aplikácie:
import kivy kivy.require("1.10.1") from kivy.uix.pagelayout import PageLayout from kivy.uix.button import Label from kivy.uix.boxlayout import BoxLayout from kivy.graphics import Color, Rectangle from kivy.app import App
Vytvoríme si triedu Kniha
, ktorá dedí z triedy
PageLayout
. Táto trieda bude pre ukážku obsahovať 2 stránky a
každá z nich bude farebne odlíšená:
class Kniha(PageLayout): def __init__(self, *args): super(Kniha, self).__init__(*args) #Vytvoříme si stránku strana1 = BoxLayout(orientation = "vertical") #Přidáme barvu do canvasu strana1.canvas.add(Color(rgba = (0.5, 0, 0.5, 1))) #Přidáme čtverec do canvasu strana1.canvas.add(Rectangle(size = self.size, pos = self.pos)) #Přidáme Label, který se zobrazí na stránce strana1.add_widget(Label(text = "Strana1")) strana2 = BoxLayout(orientation = "vertical") strana2.canvas.add(Color(rgba = (0.5, 0.5, 0, 1))) strana2.canvas.add(Rectangle(size = self.size, pos = self.pos)) strana2.add_widget(Label(text = "Strana2")) self.add_widget(strana1) self.add_widget(strana2) class PageLayoutPrikladApp(App): def build(self): return Kniha() PageLayoutPrikladApp().run()
Spustíme aplikáciu a pozrieme sa, výsledok je nasledujúci:
Keď spustíme aplikáciu, môžeme si všimnú toho, že štvorec nie je
rovnako veľký ako okno. Stalo sa to, pretože keď sa okno inicializuje, má
veľkosť len 100x100 a teda náš štvorec má túto veľkosť. Ak používate
Kivy language, na tento problém nenarazíte, pretože sa o to Kivy postará. Ak
robíme v čistom Pythone, musíme si vytvoriť takzvaný bind
/
event, ktorý sa bude volať vždy pri zmene veľkosti našich layoutov. Kód
upravíme nasledujúcim spôsobom:
class Kniha(PageLayout): def __init__(self, *args): super(Kniha, self).__init__(*args) #Vytvoříme si stránku self.strana1 = BoxLayout(orientation = "vertical") #Přidáme barvu do canvasu self.strana1.canvas.before.add(Color(rgba = (0.5, 0, 0.5, 1))) #Přidáme čtverec do canvasu self.ctverec1 = Rectangle(size = self.strana1.size, pos = self.strana1.pos) self.strana1.canvas.before.add(self.ctverec1) #Přidáme Label, který se zobrazí na stránce self.strana1.add_widget(Label(text = "Strana1")) self.strana2 = BoxLayout(orientation = "vertical") self.strana2.canvas.before.add(Color(rgba = (0.5, 0.5, 0, 1))) self.ctverec2 = Rectangle(size = self.strana2.size, pos = self.strana2.pos) self.strana2.canvas.before.add(self.ctverec2) self.strana2.add_widget(Label(text = "Strana2")) self.add_widget(self.strana1) self.add_widget(self.strana2) self.strana1.bind(size = self.update, pos = self.update) self.strana2.bind(size = self.update, pos = self.update) def update(self, *args): self.ctverec1.size = self.size self.ctverec1.pos = self.strana1.pos self.ctverec2.size = self.size self.ctverec2.pos = self.strana2.pos
Aplikácia teraz už funguje tak, ako má
Ukázali sme si, ako funguje PageLayout
. Teraz si konečne
môžeme vytvoriť sľúbenú aplikáciu Čítačka kníh, ktorá bude
spravovať niekoľko takýchto kníh.
Aplikácie Čítačka Kníh
Použijeme triedu Kniha
, ktorú sme už vytvorili. Namiesto
PageLayout
u bude však dediť z triedy Screen
. Ďalej
vykonáme menšie úpravy a pridáme ovládací panel.
Ako prvý si teda triedu Kniha
prispôsobíme:
class Kniha(Screen): def __init__(self, nazev, *args, **kwargs): super(Kniha, self).__init__(*args, **kwargs) #Vytvoříme obal, který bude vše držet pospolu self.obal_layout = BoxLayout(orientation = "vertical") #Vytvoříme si obal pro knížku self.layout = PageLayout(size_hint = (1, .9)) #Vytvoříme si stránku self.strana1 = BoxLayout(orientation = "vertical") #Přidáme barvu do canvasu self.strana1.canvas.before.add(Color(rgba = (0.5, 0, 0.5, 1))) #Přidáme čtverec do canvasu self.ctverec1 = Rectangle(size = self.strana1.size, pos = self.strana1.pos) self.strana1.canvas.before.add(self.ctverec1) #Přidáme Label, který se zobrazí na stránce self.strana1.add_widget(Label(text = nazev)) #Vytvoříme si stránku self.strana2 = BoxLayout(orientation = "vertical") #Přidáme barvu do canvasu self.strana2.canvas.before.add(Color(rgba = (0.5, 0.5, 0, 1))) #Přidáme čtverec do canvasu self.ctverec2 = Rectangle(size = self.strana2.size, pos = self.strana2.pos) self.strana2.canvas.before.add(self.ctverec2) #Přidáme Label, který se zobrazí na stránce self.strana2.add_widget(Label(text = "Strana")) #Přídáme strany do PageLayoutu a ten přídáme do obalu self.layout.add_widget(self.strana1) self.layout.add_widget(self.strana2) self.obal_layout.add_widget(self.layout) #ZDE BUDE OVLÁDACÍ PANEL self.add_widget(self.obal_layout) self.strana1.bind(size = self.update, pos = self.update) self.strana2.bind(size = self.update, pos = self.update) def update(self, *args): self.ctverec1.size = self.size self.ctverec1.pos = self.strana1.pos self.ctverec2.size = self.size self.ctverec2.pos = self.strana2.pos
Všimnite si komentáre, označujúceho budúce miesto pre ovládací panel.
Ešte predtým, než si pridáme ovládací panel, si vysvetlíme, ako
funguje ScreenManager
. Do ScreenManageru
si môžeme
pridať viac scén / screenov a medzi nimi podľa mena / name prechádzať.
Prechádzame zmenou premenné ScreenManager.current
, napr. Ako
ScreenManager.current = "jmeno_screenu"
.
Vytvoríme si triedu, ktorá dedí zo ScreenManager
:
class MujManager(ScreenManager): def __init__(self, *args): super(MujManager, self).__init__(*args) #Přidáme screeny a nastavíme jim jména self.add_widget(Kniha("Harry Potter", name = "harry_potter")) self.add_widget(Kniha("Pan Prstenu", name = "pan_prstenu")) #Funkce pro přechod mezi screeny def change_current(self, value): self.current = value
Teraz pridáme ovládací panel na miesto vyznačené komentárom v
kóde vo triede Kniha
.
self.obal_tlacitka = BoxLayout(orientation = "horizontal", size_hint = (1, .1)) self.obal_tlacitka.add_widget(Button(text = "<--", on_press = lambda *args: root.sm.change_current("harry_potter"))) self.obal_tlacitka.add_widget(Button(text = "-->", on_press = lambda *args: root.sm.change_current("pan_prstenu"))) self.obal_layout.add_widget(self.obal_tlacitka)
Teraz už stačí len pridať triedu, ktorá dedí z App
a
program len spustiť
class MainApp(App): def build(self): #Přídáme MujManager do proměnné, abychom na něj mohli odkazovat self.sm = MujManager() return self.sm root = MainApp() root.run()
Aplikácia funguje nasledovne:
Zdrojový kód nájdete na stiahnutie v prílohe článku. V budúcej lekcii,
Animácie a ScatterLayout v Kivy a Pythone , sa pozrieme na ScatterLayout
, multi-touch a animácie.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 66x (1.71 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Python