Python 在init上将变量传递给kivy label

Python 在init上将变量传递给kivy label,python,kivy,kivy-language,Python,Kivy,Kivy Language,在项目中工作,其组件需要保持模块化。我在另一个文件中有一个Kivy标签(StatusLabel),它需要一个变量(alarm),我希望将它传递给构造函数,def\uu init\uuuuu(self,alarm,**kwargs):在构建画布的其余部分时,我想不出该怎么做 如何将Jarvus的self.alarm传递到gui.py文件的StatusLabel 以下是当前非功能状态下的解决方法。在gui.py中,我尝试双重导入(jarvus.pyimportsgui)来访问属性。这不是我想要的解决

在项目中工作,其组件需要保持模块化。我在另一个文件中有一个Kivy标签(
StatusLabel
),它需要一个变量(
alarm
),我希望将它传递给构造函数,
def\uu init\uuuuu(self,alarm,**kwargs):
在构建画布的其余部分时,我想不出该怎么做


如何将Jarvus的
self.alarm
传递到gui.py文件的
StatusLabel

以下是当前非功能状态下的解决方法。在
gui.py
中,我尝试双重导入(
jarvus.py
imports
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()
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())
和GUI元素,GUI.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()
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())
KV=''
:
主屏幕:
盒子布局:
:
盒子布局:
:
'''
从kivy.uix.label导入标签
从kivy.uix.button导入按钮
从kivy.uix.widget导入widget
从kivy.uix.image导入图像
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.gridlayout导入gridlayout
从kivy.config导入配置
从kivy.core.window导入窗口
从kivy.uix.screenmanager导入screenmanager、Screen、SlideTransition
从kivy.lang导入生成器
从kivy.clock导入时钟
类屏幕管理(屏幕管理器):
定义初始(自我,**kwargs):
self.transition=SlideTransition()
#问题出在这里
类别状态标签(标签):
定义初始值(自、报警、**kwargs):
#奇维玩具
超级(状态标签,自我)。\uuuuu初始化(**kwargs)
#更新按钮
self.font\u size=24
时钟计划间隔(自我更新,.1)
#自我报警=报警
self.id='status'
def更新(自我,*参数):
尝试:
从jarvus导入jarvus
self.text=Jarvus.alarm.now()
除例外情况外:
回来
类主屏幕(屏幕):
定义初始(自我,**kwargs):
self.name='home'
self.orientation='vertical'
self.add_小部件(StatusLabel())

您无法将其传递给
StatusLabel
,因为在调用
Builder.load\u string
时,甚至没有创建StatusLabel

您正在定义一个模板,从现在起将用于所有
StatusLabel


如果您想传递一个可以由kivy解析器解析的默认值,那么您可以调整
gui.KV
以包含一个模式,在调用
Builder.load\u string
之前可以替换该模式,但这里的情况并非如此。

问题是什么?我如何将Jarvus的
self.alarm
传递到gui.py文件的
StatusLabel
?谢谢,我想我明白了。但是为了解决这个问题,我如何在
gui.KV
中实现一个可以替换的模式呢?到目前为止,我已经给出了
StatusLabel:
属性
text:app.get\u alarm().now()
,它确实显示了时间,但没有更新。刷新来自Python中由状态标签调用的
Clock.schedule\u interval(self.update.1)
guy.PY
由于双重导入,我无法从那里访问
Jarvus.PY
。有没有办法在
gui.KV
文件中声明一个变量,我可以在
gui.PY
中访问该变量?在KV文件中,您正在定义模板。变量在py文件中声明。Kivy解析器文件可以根据Kivy文件中的模板为您的变量赋值。那么如何从
jarvus.py
中获取
gui.py
文件中的变量,而不使用
import jarvus
内部
gui.py
。视频:简短回答:你不能。您可以使用另一个py文件。在jarvus.py和gui.py中导入它。为jarvus设置报警值并从gui读取。但这与kivy或python无关,而是与设计应用程序有关:)