Kivy:如何在Popup中获取类变量

时间:2018-03-26 09:05:11

标签: python python-3.x kivy kivy-language

程序:首先你必须添加一个名字,然后程序将设置一个初学者(功能“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

1 个答案:

答案 0 :(得分:1)

显示谁在弹出窗口中启动

有关详细信息,请参阅以下说明,示例和输出。

说明

screens.kv

class&lt; Namensabfrage&gt;

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)

class&lt; Manager&gt;

添加对自定义方法 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)

main.py

多重继承

不需要多重继承。删除&#34; Variablen&#34;来自课程。

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

class Variablen

  1. 由于字符串将分配给属性/变量 Beginner Zweiter ,因此请将它们定义为字符串。
  2. 修复方法 umdie 中的拼写错误。将 self.Zweiter = Variablen.Spielernamen [1] 替换为 self.Zweiter = self.Spielernamen [1]
  3. 添加方法__init __
  4. 片段

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

    类Namensabfrage

    1. 已删除方法 save_names
    2. 已初始化的ObjectProperties(name_1,name_2)为
    3. 片段

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

      类Wurfelbeginn

      1. 为新的类属性添加 ObjectProperty variablen
      2. 将方法 on_pre_enter 重命名为自定义方法 on_pre_enter_callback
      3. 将新 ObjectProperty 连接到参数 variablen
      4. Variablen 重命名为 variablen
      5. self 传递给方法 umdie
      6. 将对象 self.variablen 传递给类 CustomPopup
      7. 片段

        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

        要显示谁是初学者,请添加方法 __ 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")
        

        班级经理

        1. 添加 ObjectProperty variablen
        2. 添加方法__init __
        3. 将ObjectProperty( variablen )连接到实例化对象 Variablen (类Variablen)。
        4. 片段

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

          实施例

          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)
          

          输出