程序:首先你必须添加一个名字,然后程序将设置一个初学者(功能“umdie()”)之后,屏幕“Wurfelbeginn”将显示玩家的名字和他们有的号码。 之后你点击按钮“Wer beginnt?”看谁开始。
现在我的问题: 我想在弹出窗口中从类Variablen中显示变量“Beginner”,但如果我调用变量没有任何反应,但控制台显示正确的名称。
我做错了什么?
我的main.py代码:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivy.properties import ObjectProperty, ListProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.popup import Popup
from kivy.core.window import Window
from random import *
class Boxlayout(BoxLayout):
pass
class Textinput(TextInput):
pass
class Variablen():
Spielernamen = []
Beginner = 0
Zweiter = 0
def get_names(self, Namensabfrage):
Name1 = Namensabfrage.name_1.text
Name2 = Namensabfrage.name_2.text
self.Spielernamen.append(Name1)
self.Spielernamen.append(Name2)
print(Variablen.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 = Variablen.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()
name_2 = ObjectProperty()
def save_names(self):
vars = Variablen()
vars.get_names(self)
class Wurfelbeginn(Screen, Variablen):
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(self):
self.Spieler1 = str(Variablen.Spielernamen[0] + " würfelt: ")
self.Spieler2 = str(Variablen.Spielernamen[1] + " würfelt: ")
Variablen.umdie(self, Wurfelbeginn)
def open_popup(self):
the_popup = CustomPopup()
the_popup.open()
class CustomPopup(Popup,Variablen):
Beginnertext = StringProperty("")
def on_pre_enter(self):
self.Beginnertext = str(Variablen.Beginner + "fängt an")
print("Hallo")
class Manager(ScreenManager):
namensabfrage = ObjectProperty(None)
wurfelbeginn = ObjectProperty(None)
class ScreensApp(App):
def build(self):
m = Manager(transition=SlideTransition())
return m
if __name__ == "__main__":
ScreensApp().run()
这里是screes.kv:
#:kivy 1.10.0
<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: root.save_names()
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:
Label:
text: root.Beginnertext
Button:
text: "schließen"
on_press: root.dismiss()
<Manager>:
id: screen_manager
namensabfrage: Namensabfrage
wurfelbeginn: Wurfelbeginn
Namensabfrage:
id: Namensabfrage
name: "Screen1"
manager: screen_manager
Wurfelbeginn:
id: Wurfelbeginn
name: "Screen2"
manager: screen_manager
答案 0 :(得分:1)
有关详细信息,请参阅以下说明,示例和输出。
将 root.save_names()替换为 app.root.variablen.get_names(root),并传递 root 以便新创建对象, Variablen 可由其他类访问。
<Namensabfrage>:
...
Button:
text: "Bestätigen"
size_hint:(1,.4)
on_press: app.root.variablen.get_names(root)
添加对自定义方法 on_pre_enter_callback 的调用,并传递新创建的对象 app.root.variablen ,以便其他类可以访问它。
<Manager>:
transition: SlideTransition()
...
Wurfelbeginn:
id: Wurfelbeginn
name: "Screen2"
manager: screen_manager
on_pre_enter: self.on_pre_enter_callback(app.root.variablen)
不需要多重继承。删除&#34; Variablen&#34;来自课程。
class Wurfelbeginn(Screen):
...
class CustomPopup(Popup):
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(Screen):
name_1 = ObjectProperty(None)
name_2 = ObjectProperty(None)
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)
要显示谁是初学者,请添加方法 __ init __ 以填充class属性 Beginnertext 。
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)
...
def __init__(self, **kwargs):
super(Manager, self).__init__(**kwargs)
self.variablen = Variablen() # Instantiate object Variablen
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()
#: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)