# Instuderingsfrågor Python och Kivy
* Förklara vad följande widgets används till:
* Label
* Button
* Image
* TextInput
* Förklara skillnaden på en `BoxLayout` och en `GridLayout`.
* Förklara hur man byter skärm med hjälp av en ScreenManager i kivy.
* Skriv några rader kod som skapar en funktion som skriver ut texten "Knapptryck!" till konsolen och kopplar den till en Kivy-button.
* Gör en liten skiss över vad följande kod kommer generera för app:
```python
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
class TestApp(App):
def build(self):
layout1 = BoxLayout(orientation="vertical")
layout1.add_widget(Label(text="Text1"))
layout2 = BoxLayout(orientation="horizontal")
layout2.add_widget(Label(text="Text2"))
layout2.add_widget(Label(text="Text3"))
layout2.add_widget(Label(text="Text4"))
layout1.add_widget(layout2)
return layout1
TestApp().run()
```
* Förklara vad en lista är i python och ge ett exempel på vad man kan använda de till.
* Skriv några rader kod som med hjälp av en loop skriver ut varje element i följande lista på en ny rad.
`things = ["Äpple", "Bil", "Hund", "Bok", "Dator", "Klocka"]`
* Vad kommer hända när man trycker på knappen i följande app?
```python
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
class TestApp(App):
def build(self):
layout = BoxLayout(orientation='vertical')
self.label = Label(text="Hello!")
button = Button(text="Click here")
button.bind(on_press=self.change_text)
layout.add_widget(self.label)
layout.add_widget(button)
return layout
def change_text(self, instance):
self.label.text = "Goodbye!"
TestApp().run()
```
* Gör en liten skiss över vad följande kod kommer generera för app:
```python
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
class TestApp(App):
def build(self):
layout = BoxLayout(orientation='vertical')
labels_text = ["Handla mat", "Träna", "Läsa en bok", "Skriva rapport"]
for text in labels_text:
label = Label(text=text)
layout.add_widget(label)
return layout
TestApp().run()
```
* Förklara varför man vill använda en kv-fil istället för att skapa widgets i build-funktionen.
* Hur behöver man namnge kv-filen för att den ska läsas av python-koden?
* Vad är fel i följande kod?
```python
from kivy.app import App
from kivy.uix.button import Button
class TestApp(App):
def build(self):
button = Button(text="Hello, Kivy!", on_press=button_pressed)
return button
def button_pressed(self, btn):
print("Knappen trycktes!")
TestApp().run()
```
* Vad är fel i följande kod?
```python
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
class TestApp(App):
def build(self):
counter = 0
layout = BoxLayout(orientation="vertical")
counterLabel = Label(text="Count: 0")
button = Button(text="Increase counter", on_press=self.increase_counter)
layout.add_widget(counterLabel)
layout.add_widget(button)
return layout
def increase_counter(self, btn):
counter += 1
counterLabel.text = "Count: " + str(counter)
TestApp().run()
```
* Gör en liten skiss på hur en app kommer se ut som är skapade med följande kv-fil?
```python
BoxLayout:
orientation: 'vertical'
Label:
text: 'Välkommen!'
GridLayout:
cols: 2
Label:
text: 'Användarnamn:'
TextInput:
hint_text: 'Ange ditt användarnamn'
Label:
text: 'Lösenord:'
TextInput:
hint_text: 'Ange ditt lösenord'
Button:
text: 'Logga in'
```
* Vad innebhär det att ett en widget är *child* till en annan widget?
* Förklara vad som syftas på med orden *self*, *root*, och *app* i en kv-fil.
### Övningar
*Enklare:*
* Skapa en app som har en knapp och en label. Varje gång man trycker på knappen ska labeln visa ett slumpvalt citat. Använda en lista med olika citat, och `random` för att slumpa fram en plats i listan.
*Utmaning:*
* Skapa ett tre-i-rad spel med hjälp av kivy. Använd knappar som ligger i en grid-layout, och en lista har 9 variabler, där varje håller koll på om rutan är tom eller har X eller O.