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