【问题标题】:Kivy: How to get class Variables in PopupKivy:如何在弹出窗口中获取类变量
【发布时间】:2018-03-26 09:05:11
【问题描述】:

程序:首先您必须添加一个名称,然后程序将设置一个初学者(函数“umdie()”),然后屏幕“Wurfelbeginn”将向您显示玩家的姓名和他们的号码. 之后,您单击“我们开始了吗?”按钮。看看谁开始。

现在我的问题是: 我想在弹出窗口中显示类 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

【问题讨论】:

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


    【解决方案1】:

    在弹出窗口中显示谁开始

    详情请参考以下解释、示例和输出。

    说明

    screens.kv

    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)
    

    main.py

    ​​>

    多重继承

    不需要多重继承。从类中删除了“Variablen”。

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

    类变量

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

    片段

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

    类名称abfrage

    1. 删除方法 save_names
    2. 已将 ObjectProperties (name_1, name_2) 初始化为

    片段

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

    类 Wurfelbeginn

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

    片段

    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)
    

    类 CustomPopup

    为了显示谁是初学者,添加一个方法__init__来填充类属性,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变量
    2. 添加方法__init__
    3. 将 ObjectProperty (variablen) 连接到实例化对象 Variablen(Variablen 类)。

    片段

    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)
    

    输出

    【讨论】:

    • 它不起作用....在你的例子中亚当是初学者,所以他的名字必须作为文本输入中的文本。您在 Textinput 中手动编写了名称“Eve”。那不是意义。还是谢谢。
    • 还有其他人有解决办法吗?
    • 我更新了我的帖子。现在它在弹出窗口中正确显示谁开始(Beginnertext)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多