如何使用 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
希望对您有所帮助
我的应用程序目前有 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
希望对您有所帮助