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
- Since string will be assigned to the attribute/variable Beginner and Zweiter, define them as string.
- Fix a typo error in method umdie. Replace self.Zweiter = Variablen.Spielernamen[1] with self.Zweiter = self.Spielernamen[1]
- 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
- Removed method save_names.
- Initialized ObjectProperties (name_1, name_2) to None.
Snippets
class Namensabfrage(Screen):
name_1 = ObjectProperty(None)
name_2 = ObjectProperty(None)
class Wurfelbeginn
- Add an ObjectProperty for new class attribute, variablen
- Rename method on_pre_enter to a customized method, on_pre_enter_callback
- Hook up the new ObjectProperty to the argument, variablen
- Renamed Variablen to variablen
- Pass self to method umdie
- 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
- Add an ObjectProperty, variablen
- Add a method __init__
- 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)
Post a Comment for "Kivy: How To Get Class Variables In Popup"