【发布时间】:2021-05-04 20:40:32
【问题描述】:
我想使用 .kv 中的按钮更新我的班级 MainHero 中的值,并基于我班级中的属性 nick 我需要更新 .kv中的标签>。
我需要自动处理这个问题,因为许多其他属性会自动生成,所以 labels 需要更新。
这是我的代码的一部分:
from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import *
from kivy.lang import Builder
from kivy.clock import Clock
class MainHero():
def __init__(self):
self.nick = "Player"
class FightScreen(Screen):
def __init__(self, **kwargs):
super(FightScreen, self).__init__(**kwargs)
self.af_init = Clock.create_trigger(self._init)
self.af_init()
def _init(self, dt):
self.app = App.get_running_app()
def rename(self):
self.app.main_hero.nick = "Renamed"
class ScreenManagement(ScreenManager):
pass
class Design(App):
def __init__(self, **kwargs):
super(Design, self).__init__(**kwargs)
self.main_hero = MainHero() # Tried main_hero = MainHero() too
self.val = StringProperty(self.main_hero.nick) # string
# Construct app
def build(self):
# design constructor
kv = Builder.load_file('AppDesign.kv')
return kv
if __name__ == "__main__":
Design().run()
# Using kv 2.0
ScreenManagement:
id: screen_manager
FightScreen:
name: 'FightScreen'
manager: screen_manager
id: fight_screen
<FightScreen>
FloatLayout:
Label:
text: app.val
size_hint: .2, .2
pos_hint: {'center_x': .5, 'center_y': .35}
Button:
size_hint: .2, .2
pos_hint: {'center_x': .5, 'center_y': .5}
on_press:
root.rename()
可能通过properties/EventDispetcher.
在我尝试的许多情况下,参考 app.val 类似于
class Aaa(EventDispetcher);apply_property(**kwargs)我也想用ObjectProperty做到这一点,我认为它是不同的,我不知道该怎么做。
编辑:
def rename(self):
self.app.main_hero.nick = "Renamed"
self.app.main_hero.num += 1
self.app.val = self.app.main_hero # not working need replace
# probably something here (replacement)
class MainHero():
def __init__(self):
self.nick = "Player"
self.num = 1
.
.
.
class Design(App):
val = ObjectProperty()
def __init__(self, **kwargs):
super(Design, self).__init__(**kwargs)
self.main_hero = MainHero() # Tried main_hero = MainHero() too
self.val = self.main_hero # object
.
.
.
Label:
text: app.val.nick
size_hint: .2, .2
pos_hint: {'center_x': .5, 'center_y': .35}
Label:
text: str(app.val.num)
size_hint: .2, .2
pos_hint: {'center_x': .7, 'center_y': .7}
【问题讨论】:
标签: python kivy kivy-language