Skip to content Skip to sidebar Skip to footer

Kivy: How To Get Class Variables In Popup

procedure: First you have to add a Name and than the Programm will set a Beginner (function 'umdie()') after that the Screen 'Wurfelbeginn' will Show you the names of the Players a

Solution 1:

Display Who Starts in Popup Window

Please refer to the following explanations, example, and output for details.

Explanations

screens.kv

class <Namensabfrage>

Replace root.save_names() with app.root.variablen.get_names(root), and pass root so that the newly created object, Variablen is accessible by the other classes.

Snippets

<Namensabfrage>:
    ...
        Button:
            text: "Bestätigen"
            size_hint:(1,.4)
            on_press: app.root.variablen.get_names(root)

class <Manager>

Add a call to customized method, on_pre_enter_callback and pass the newly created object, app.root.variablen so that it is accessible by the other classes.

Snippets

<Manager>:
    transition: SlideTransition()
    ...
    Wurfelbeginn:

        id: Wurfelbeginn
        name: "Screen2"
        manager: screen_manager
        on_pre_enter: self.on_pre_enter_callback(app.root.variablen)

main.py

Mulitple Inheritance

There is no need for multiple inheritance. Removed "Variablen" from classes.

class Wurfelbeginn(Screen):
...
class CustomPopup(Popup):

class Variablen

  1. Since string will be assigned to the attribute/variable Beginner and Zweiter, define them as string.
  2. Fix a typo error in method umdie. Replace self.Zweiter = Variablen.Spielernamen[1] with self.Zweiter = self.Spielernamen[1]
  3. Add a method __init__

Snippets

class Variablen():
    def __init__(self):
        self.Spielernamen = []
        self.Beginner = ''
        self.Zweiter = ''
...
    def umdie(self, Wurfelbeginn):
        ...
        elif Wurfelbeginn.Würfel1 == Wurfelbeginn.Würfel2:
          ...
          self.Zweiter = self.Spielernamen[1]
        else:
          ...

class Namensabfrage

  1. Removed method save_names.
  2. Initialized ObjectProperties (name_1, name_2) to None.

Snippets

class Namensabfrage(Screen):
    name_1 = ObjectProperty(None)
    name_2 = ObjectProperty(None)

class Wurfelbeginn

  1. Add an ObjectProperty for new class attribute, variablen
  2. Rename method on_pre_enter to a customized method, on_pre_enter_callback
  3. Hook up the new ObjectProperty to the argument, variablen
  4. Renamed Variablen to variablen
  5. Pass self to method umdie
  6. Pass object, self.variablen to class CustomPopup

Snippets

class Wurfelbeginn(Screen):
    variablen = ObjectProperty(None)
    ...

    def on_pre_enter_callback(self, variablen):
        self.variablen = variablen
        self.Spieler1 = str(variablen.Spielernamen[0] + " würfelt: ")
        self.Spieler2 = str(variablen.Spielernamen[1] + " würfelt: ")
        variablen.umdie(self)

    def open_popup(self):
        the_popup = CustomPopup(self.variablen)

class CustomPopup

In order to display who is the beginner, add a method __init__ to populate the class attribute, Beginnertext.

Snippets

class CustomPopup(Popup):
    Beginnertext = StringProperty('')

    def __init__(self, variablen, **kwargs):
        super(CustomPopup, self).__init__(**kwargs)
        self.Beginnertext = str(variablen.Beginner + " fängt an")
        print(self.Beginnertext)
        print("Hallo")

class Manager

  1. Add an ObjectProperty, variablen
  2. Add a method __init__
  3. Hook up the ObjectProperty (variablen) to instantiated object, Variablen (class Variablen).

Snippets

class Manager(ScreenManager):
    variablen = ObjectProperty(None)
    ...

    def __init__(self, **kwargs):
        super(Manager, self).__init__(**kwargs)
        self.variablen = Variablen()     # Instantiate object Variablen

Example

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup
from random import *


class Boxlayout(BoxLayout):
    pass


class Textinput(TextInput):
    pass


class Variablen():
    def __init__(self):
        self.Spielernamen = []
        self.Beginner = ''
        self.Zweiter = ''

    def get_names(self, Namensabfrage):
        Name1 = Namensabfrage.name_1.text
        Name2 = Namensabfrage.name_2.text
        self.Spielernamen.append(Name1)
        self.Spielernamen.append(Name2)
        print(self.Spielernamen)

    def umdie(self, Wurfelbeginn):
        if Wurfelbeginn.Würfel1 > Wurfelbeginn.Würfel2:
          self.Beginner = self.Spielernamen[0]
          self.Zweiter = self.Spielernamen[1]

        elif Wurfelbeginn.Würfel1 == Wurfelbeginn.Würfel2:
          self.Beginner = self.Spielernamen[0]
          self.Zweiter = self.Spielernamen[1]
        else:
          self.Beginner = self.Spielernamen[1]
          self.Zweiter = self.Spielernamen[0]

        print(self.Beginner)
        print(self.Zweiter)


class Namensabfrage(Screen):
    name_1 = ObjectProperty(None)
    name_2 = ObjectProperty(None)


class Wurfelbeginn(Screen):
    variablen = ObjectProperty(None)
    Spieler1 = StringProperty('')
    Spieler2 = StringProperty('')
    Würfel1 = randint(1, 6)
    Würfel2 = randint(1, 6)
    WürfSp1 = str(Würfel1)
    WürfSp2 = str(Würfel2)

    def on_pre_enter_callback(self, variablen):
        self.variablen = variablen
        self.Spieler1 = str(variablen.Spielernamen[0] + " würfelt: ")
        self.Spieler2 = str(variablen.Spielernamen[1] + " würfelt: ")
        variablen.umdie(self)

    def open_popup(self):
        the_popup = CustomPopup(self.variablen)
        the_popup.open()


class CustomPopup(Popup):
    Beginnertext = StringProperty('')

    def __init__(self, variablen, **kwargs):
        super(CustomPopup, self).__init__(**kwargs)
        self.Beginnertext = str(variablen.Beginner + " fängt an")
        print(self.Beginnertext)
        print("Hallo")


class Manager(ScreenManager):
    variablen = ObjectProperty(None)
    namensabfrage = ObjectProperty(None)
    wurfelbeginn = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(Manager, self).__init__(**kwargs)
        self.variablen = Variablen()     # Instantiate object Variablen


class ScreensApp(App):

    def build(self):
        return Manager()


if __name__ == "__main__":
    ScreensApp().run()

screens.kv

#:kivy 1.10.0
#:import SlideTransition kivy.uix.screenmanager.SlideTransition

<Namensabfrage>:

    name_1: name1
    name_2: name2

    Boxlayout:
        orientation: 'vertical'
        padding: 50
        spacing: 50
        Label:
            text: "gebt hier eure Namen ein"

        Textinput:
            id: name1
            size_hint: (1, .3)
            text: ""
            multiline: False

        Textinput:
            id: name2
            size_hint: (1, .3)
            text: ""
            multiline: False

        Button:
            text: "Bestätigen"
            size_hint:(1,.4)
            on_press: app.root.variablen.get_names(root)

        Button:
            size_hint: (1, .5)
            text: "Start"
            on_press: root.manager.current = "Screen2"



<Wurfelbeginn>:

    Boxlayout:
        orientation: 'vertical'
        spacing: 20

        Button:
            text: "Wer beginnt?"
            size_hint:(1,.4)
            font_size: 20
            on_press: root.open_popup()

        Label:
            text: root.Spieler1

        Label:
            text: root.WürfSp1
            font_size: 30

        Label:
            text: root.Spieler2

        Label:
            text: root.WürfSp2
            font_size: 30


<CustomPopup>:
    size_hint: .5, .5
    auto_dismiss: False
    title: "Beginner"
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: root.Beginnertext
        Button:
            text: "schließen"
            on_press: root.dismiss()


<Manager>:
    id: screen_manager
    transition: SlideTransition()

    namensabfrage: Namensabfrage
    wurfelbeginn: Wurfelbeginn


    Namensabfrage:

        id: Namensabfrage
        name: "Screen1"
        manager: screen_manager

    Wurfelbeginn:

        id: Wurfelbeginn
        name: "Screen2"
        manager: screen_manager
        on_pre_enter: self.on_pre_enter_callback(app.root.variablen)

Output


Post a Comment for "Kivy: How To Get Class Variables In Popup"