如何使用 Kivy TextInput 更改全局对象属性并将其保存以备后用?

How to make changes to global object attribute with Kivy TextInput and have it save for later use?

我的应用程序目前有 10 个“玩家”,具有名称、进攻等级和防守等级。我想在 运行 运行我的游戏模拟代码之前让用户有机会更改玩家的名字,但看来我只能暂时更改当前屏幕内的名字。这是我当前的 python 代码,当用户从 gui 中输入名称时:

class SecondWindow(Screen):
    def pg1_name_val(self, widget):
    pg1.name = widget.text

如果我在其正下方编写 print(pg1.name) 代码,它将打印正确的名称,但是当用户点击“播放”以切换到结果屏幕时,名称会返回到默认名称。

如何使我的 SecondWindow(Screen) 中的 pg1.name 成为全局 pg1.name?有没有简单的代码行我可以使用 return pg1.name 作为全局变量?

编辑----

本周我的应用程序取得了很大进展,但现在我想要一个单独的“结果”屏幕,我意识到我丢失了前一个屏幕的所有数据。看起来我对“播放器”所做的所有更改都会在屏幕更改后恢复为默认设置。我将在下面粘贴一些代码以供参考。基本上,我现在的问题是:有没有一种方法可以将对象保留在一个屏幕上,然后 return 将它们作为对象的全局实例返回。不仅仅是对象的本地实例。

.py -

class Player():
def __init__(self,name,off,deff):
    self.name = name
    self.off = off
    self.deff = deff
    self.stats = 0

class 团队(): def init(self,pg,sg,sf,pf,c): self.pg = pg self.sg = 新加坡 self.sf = 旧金山 self.pf = pf self.c = c self.score = 0 self.results = None self.to = 0

在我创建团队的屏幕上,我有一个 运行 模拟按钮。此按钮 运行 正确模拟 sim,将所有游戏结果记录在一个字符串中,将所有结果打印到控制台、属性和正确得分。该按钮还将屏幕更改为我想要显示结果字符串的滚动视图的位置,但结果是空的。

我真的很感激任何帮助,因为我遇到了障碍。谢谢!

看起来有点一样。取决于您想要留住 10 名不同球员的确切程度。

class Player():
    def __init__(self, name, off, deff):
        self.name = name
        self.off = off
        self.deff = deff
        self.stats = 0

player = [Player('', 0, 0)] * 10


class SecondWindow(Screen):
    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)
        self.player = player

    def name_change(self):
        self.player[0].name = self.ids.name.text
        player[0].name = self.player[0].name


    def next_screen(self):
        self.manager.current = 'result'


class ResultWindow(Screen):
    def __init__(self, **kwargs):
        super(ResultWindow, self).__init__(**kwargs)

    def on_enter(self, *args):
        print(player[0].name)


class Manager(ScreenManager):
    pass


class Player(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(SecondWindow(name='second'))
        sm.add_widget(ResultWindow(name='result'))
        return sm


if __name__ == '__main__':
    Player().run()

您将不得不使用 OOP,在这里我为所有 10 个玩家创建了一个玩家对象列表,这是保持代码简短的简单方法。 您可能希望将它们保留为 10 个不同的对象——列表的重要部分,它很容易在 for 循环中迭代,然后在屏幕上获取统计板的所有数据,如果您需要 20 个玩家,以后也很容易扩展或更多。

我没有更改 .kv 文件中的任何内容。

.kv

<SecondWindow>:
    TextInput:
        id: name
        hint_text: 'Player name'
        size: 260, 32
        pos: (root.width / 2) - (self.width / 2), 248
        multiline: False
        on_text_validate: root.name_change()
    Button:
        id: create_btn
        text: 'Next Screen'
        size: 260, 32
        pos: (root.width / 2) - (self.width / 2), 206
        color: utils.get_color_from_hex('#ffffff')
        background_color: utils.get_color_from_hex('#016bf8')
        on_press: root.next_screen()

<ResultWindow>:
    Label:
        id: name

on_text_validate 仅适用于多行 false 并且如果您不想按 enter user on_text 而按 enter 时。

--编辑--

我今天早上做了一些研究,想用我的发现来更新一下。 您可以不导入到所有屏幕,而是在屏幕管理器中执行它,然后像这样从屏幕调用它:

pyhon.py

import kivy
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen


class Player:
    def __init__(self, name, off, deff):
        self.name = name
        self.off = off
        self.deff = deff
        self.stats = 0


class SecondWindow(Screen):
    def __init__(self, **kwargs):
        super(SecondWindow, self).__init__(**kwargs)

    def name_change(self):
        self.manager.player.name = self.ids.name.text


    def next_screen(self):
        self.manager.current = 'result'


class ResultWindow(Screen):
    def __init__(self, **kwargs):
        super(ResultWindow, self).__init__(**kwargs)

    def on_enter(self):
        self.ids.name.text = self.manager.player.name


class Manager(ScreenManager):
    player = Player('', 0, 0)

    def __init__(self, **kwargs):
        super(Manager, self).__init__(**kwargs)


class PlayerApp(App):
    def build(self):
        return Builder.load_file('test.kv')


if __name__ == '__main__':
    PlayerApp().run()

kv 文件看起来像这样:

.kv

#:import utils kivy.utils
Manager:
    SecondWindow:
        name: 'second'
    ResultWindow:
        name: 'result'

<SecondWindow>:
    TextInput:
        id: name
        hint_text: 'Player name'
        size: 260, 32
        size_hint: None, None
        pos: (root.width / 2) - (self.width / 2), 248
        multiline: False
        on_text_validate: root.name_change()
    Button:
        id: create_btn
        text: 'Next Screen'
        size_hint: None, None
        size: 260, 32
        pos: 0, 0
        color: utils.get_color_from_hex('#ffffff')
        background_color: utils.get_color_from_hex('#016bf8')
        on_press: root.next_screen()

<ResultWindow>:
    Label:
        id: name

希望对您有所帮助