---
# System prepended metadata

title: Instuderingsfrågor Python och Kivy

---

# 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.