Kivy:如何在弹出窗口中获取类变量

2024-10-01 15:40:15 发布

您现在位置:Python中文网/ 问答频道 /正文

程序:首先你必须添加一个名字,然后程序将设置一个初学者(函数“umdie()”),然后屏幕“Wurfelbeginn”将显示玩家的名字和他们拥有的号码。 之后,你点击按钮“Wer beginnt?”看谁开始。在

现在我的问题是: 我想在弹出窗口中显示Variablen类中的变量“初学者”,但是如果我调用变量,则什么都不会发生,但是控制台会显示正确的名称。在

我做错什么了?在

我的主.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()

这里呢电石千伏公司名称:

^{pr2}$

Tags: namefromimportselfdefclasskivystr
1条回答
网友
1楼 · 发布于 2024-10-01 15:40:15

在弹出窗口中显示谁开始

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

解释

在屏幕.kv在

class<;namesabrage>;

替换root.save_名称()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)

班级经理

添加一个对自定义方法的调用,在pre_enter_callback并传递新创建的对象app.root.variablen应用程序根目录以便其他类可以访问它。

片段

^{pr2}$

在主.py在

多重继承

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

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

类变量

  1. 因为string将被分配给属性/变量初学者Zweiter,所以将它们定义为string。在
  2. 修正methodumdie中的一个打字错误。替换自我。茨威特= 斯皮尔纳曼[1] 自我。茨威特= 自我。斯皮尔纳曼[1]
  3. 添加方法

片段

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

类名sabfrage

  1. 删除了方法保存名称。在
  2. 已初始化名称。在

片段

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

Wurfelbeginn

  1. 为新的class属性添加一个ObjectPropertyvariablen
  2. 将pre-enter上的method重命名为自定义方法,on_pre_enter_callback
  3. 将新的ObjectProperty连接到参数variablen
  4. Variablen重命名为Variablen
  5. 自身传递到方法umdie
  6. 传递对象,自变量到类自定义弹出

片段

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

为了显示谁是初学者,请添加一个方法来填充class属性初学者文本

片段

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. 添加方法
  3. 将ObjectProperty(variablen)连接到实例化的object,variablen(类variablen)。在

片段

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

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

示例

在主.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()

在屏幕.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)

输出

相关问题 更多 >

    热门问题