Kivy:使用Screen Manager更改了变量

时间:2018-03-21 10:31:09

标签: python kivy kivy-language

首先是我的main.py代码:

import kivy

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):
        Name1 = Namensabfrage.name_1.text
        Name2 = Namensabfrage.name_2.text
        self.Spielernamen.append(Name1)
        self.Spielernamen.append(Name2)
        print(Variablen.Spielernamen)



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


class Anzeige(Screen, Variablen):
    Spieler1 = str(Variablen.Spielernamen[0])
    Spieler2 = str(Variablen.Spielernamen[1])

class Manager(ScreenManager):

    namensabfrage = ObjectProperty(None)
    anzeige = ObjectProperty(None)

class ScreensApp(App):

    def build(self):
        m = Manager(transition=SlideTransition())
        return m


if __name__ == "__main__":
    ScreensApp().run()

然后我的Screen.kv文件:

<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.Variablen.get_names()

        Button: 
            size_hint: (1, .5)
            text: "Start"
            on_press: root.manager.current = "Screen2"



<Anzeige>:

    Boxlayout:
        orientation: 'vertical'
        spacing: 50

        Label: 
            text: root.Spieler1

        Label:
            text: root.Spieler2


<Manager>: 
    id: screen_manager

    namensabfrage: Namensabfrage
    anzeige: Anzeige


    Namensabfrage: 

        id: Namensabfrage
        name: "Screen1"
        manager: screen_manager

    Anzeige: 

        id: Anzeige
        name: "Screen2"
        manager: screen_manager

我现在的问题是:

我想在屏幕“Anzeige”中显示列表元素“Spielernamen”。但是,如果我运行程序,它表示列表索引超出范围。我知道列表索引超出范围。但我想在此列表中添加名称为“get_names()”的函数。 所以首先我要获取名称,然后我想在另一个屏幕中显示名称。

我该怎么做?

我希望你理解我的问题

提前谢谢!!

1 个答案:

答案 0 :(得分:0)

问题

IndexError:列表索引超出范围 - Spieler1 = str(Variablen.Spielernamen [0])

发生此错误是因为在实例化类时,列表Variablen.Spielernamen [0]为空。

解决方案

对IndexError的修复,添加方法on_pre_enter,如下所示:

class Anzeige(Screen, Variablen):

    def on_pre_enter(self):
        Spieler1 = str(Variablen.Spielernamen[0])
        Spieler2 = str(Variablen.Spielernamen[1])

注意

修复IndexError时,会出现更多错误。请参阅我的示例,了解所有错误的完整解决方案。

实施例

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)


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

    def save_names(self):
        vars = Variablen()
        vars.get_names(self)


class Anzeige(Screen, Variablen):
    Spieler1 = StringProperty("")
    Spieler2 = StringProperty("")

    def on_pre_enter(self):
        self.Spieler1 = str(Variablen.Spielernamen[0])
        self.Spieler2 = str(Variablen.Spielernamen[1])


class Manager(ScreenManager):

    namensabfrage = ObjectProperty(None)
    anzeige = ObjectProperty(None)


class ScreensApp(App):

    def build(self):
        m = Manager(transition=SlideTransition())
        return m


if __name__ == "__main__":
    ScreensApp().run()

screens.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"



<Anzeige>:

    Boxlayout:
        orientation: 'vertical'
        spacing: 50

        Label:
            text: root.Spieler1

        Label:
            text: root.Spieler2


<Manager>:
    id: screen_manager

    namensabfrage: Namensabfrage
    anzeige: Anzeige


    Namensabfrage:

        id: Namensabfrage
        name: "Screen1"
        manager: screen_manager

    Anzeige:

        id: Anzeige
        name: "Screen2"
        manager: screen_manager

输出

Img01 - App Startup Img02 - Names Entered Img03 - Clicked Confirm Button Img04 - Names Displayed After Clicked Start Button

相关问题