将变量传递给 init 上的 kivy 标签
Passing a variable to kivy label on init
正在处理一个组件需要保持模块化的项目。我在另一个需要变量 (alarm
) 的文件中有一个 Kivy 标签 (StatusLabel
),我更愿意将它传递给构造函数,def __init__(self, alarm, **kwargs):
我不知道如何在构建 canvas 的其余部分时做到这一点。
如何将 Jarvus 的 self.alarm
传递给 gui.py 文件的 StatusLabel
?
这是当前非功能状态下的解决方法。在 gui.py
中,我尝试使用双重导入(jarvus.py
导入 gui
)来访问属性。这不是我想要的解决方案。
主文件:jarvus.py
import comms
import alarm
import gui
from kivy.app import App, Builder
class Jarvus(App):
comms_system = comms.Comms()
alarm = alarm.Alarm(comms_system)
def build(self):
# comms thread
self.comms_system.setDaemon(True)
self.comms_system.start()
self.comms_system.log("comms started")
# alarm thread
self.alarm.setDaemon(True)
self.alarm.start()
self.comms_system.log("alarm started")
# this WOULD work if I only wanted the single widget
# return gui.StatusLabel(self.alarm)
# How can I get self.alarm into this Builder?
return Builder.load_string(gui.KV)
Jarvus().run()
和 GUI 元素,gui.py
KV = '''
<ScreenManagement>:
HomeScreen:
BoxLayout:
<HomeScreen>:
BoxLayout:
<StatusLabel>:
'''
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivy.lang import Builder
from kivy.clock import Clock
class ScreenManagement(ScreenManager):
def __init__(self, **kwargs):
self.transition = SlideTransition()
# HERE'S THE PROBLEM
class StatusLabel(Label):
def __init__(self, alarm, **kwargs):
# kivy stuff
super(StatusLabel, self).__init__(**kwargs)
# make the button update
self.font_size = 24
Clock.schedule_interval(self.update, .1)
# self.alarm = alarm
self.id = 'status'
def update(self, *args):
try:
from jarvus import Jarvus
self.text = Jarvus.alarm.now()
except Exception:
return
class HomeScreen(Screen):
def __init__(self, **kwargs):
self.name = 'home'
self.orientation = 'vertical'
self.add_widget(StatusLabel())
您不能将它传递给 StatusLabel
,因为在您调用 Builder.load_string
时甚至还没有创建 StatusLabel。
您正在定义一个模板,此模板将从现在起用于所有 StatusLabel
。
如果你想传递一个可以被 kivy 解析器解析的默认值,那么你可以调整 gui.KV
以包含一个你可以在调用 Builder.load_string
之前替换的模式,但是这这里不是这样。
正在处理一个组件需要保持模块化的项目。我在另一个需要变量 (alarm
) 的文件中有一个 Kivy 标签 (StatusLabel
),我更愿意将它传递给构造函数,def __init__(self, alarm, **kwargs):
我不知道如何在构建 canvas 的其余部分时做到这一点。
如何将 Jarvus 的 self.alarm
传递给 gui.py 文件的 StatusLabel
?
这是当前非功能状态下的解决方法。在 gui.py
中,我尝试使用双重导入(jarvus.py
导入 gui
)来访问属性。这不是我想要的解决方案。
主文件:jarvus.py
import comms
import alarm
import gui
from kivy.app import App, Builder
class Jarvus(App):
comms_system = comms.Comms()
alarm = alarm.Alarm(comms_system)
def build(self):
# comms thread
self.comms_system.setDaemon(True)
self.comms_system.start()
self.comms_system.log("comms started")
# alarm thread
self.alarm.setDaemon(True)
self.alarm.start()
self.comms_system.log("alarm started")
# this WOULD work if I only wanted the single widget
# return gui.StatusLabel(self.alarm)
# How can I get self.alarm into this Builder?
return Builder.load_string(gui.KV)
Jarvus().run()
和 GUI 元素,gui.py
KV = '''
<ScreenManagement>:
HomeScreen:
BoxLayout:
<HomeScreen>:
BoxLayout:
<StatusLabel>:
'''
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.widget import Widget
from kivy.uix.image import Image
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen, SlideTransition
from kivy.lang import Builder
from kivy.clock import Clock
class ScreenManagement(ScreenManager):
def __init__(self, **kwargs):
self.transition = SlideTransition()
# HERE'S THE PROBLEM
class StatusLabel(Label):
def __init__(self, alarm, **kwargs):
# kivy stuff
super(StatusLabel, self).__init__(**kwargs)
# make the button update
self.font_size = 24
Clock.schedule_interval(self.update, .1)
# self.alarm = alarm
self.id = 'status'
def update(self, *args):
try:
from jarvus import Jarvus
self.text = Jarvus.alarm.now()
except Exception:
return
class HomeScreen(Screen):
def __init__(self, **kwargs):
self.name = 'home'
self.orientation = 'vertical'
self.add_widget(StatusLabel())
您不能将它传递给 StatusLabel
,因为在您调用 Builder.load_string
时甚至还没有创建 StatusLabel。
您正在定义一个模板,此模板将从现在起用于所有 StatusLabel
。
如果你想传递一个可以被 kivy 解析器解析的默认值,那么你可以调整 gui.KV
以包含一个你可以在调用 Builder.load_string
之前替换的模式,但是这这里不是这样。