2017-02-20 36 views
0

コンポーネントをモジュール化しておく必要があるプロジェクトで作業する。変数(alarm)が必要な別のファイルにKivyのラベル(StatusLabel)があり、それをコンストラクタに渡すことをお勧めします。def __init__(self, alarm, **kwargs):残りのキャンバスを構築する際に、その方法を理解できません。initでkivyラベルに変数を渡す

ヤルバスのself.alarmgui.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()) 
+1

質問は何ですか? – Juggernaut

+0

Jarvusの 'self.alarm'を_gui.py_ファイルの' StatusLabel'にどのように渡すことができますか? – dadiletta

答えて

1

StatusLabelではないので、あなたがStatusLabelにそれを渡すことはできませんBuilder.load_stringと呼んでいる時点で作成されています。

今からすべてStatusLabelに使用されるテンプレートを定義しています。

kivyパーサーが解析できるデフォルト値を渡したい場合は、Builder.load_stringを呼び出す前に置き換えることができるパターンを含めるようにgui.KVを調整することができましたが、ここには該当しません。

+0

ありがとう、私は私が続くと思います。しかし、この問題を解決するために、私が置き換えることができる 'gui.KV'にパターンを実装するにはどうしたらいいですか?これまでは、 'StatusLabel:'プロパティ 'text:app.get_alarm()。now()'を与えましたが、時刻は表示されますが、更新はされません。リフレッシュは 'StatusLabel'によって呼び出された' Clock.schedule_interval(self.update、.1) 'からもたらされ、それはPythonの' guy.PY'にあり、二重インポートのため 'Jarvus.py'にアクセスできません。 – dadiletta

+0

'gui.KV'ファイルに' gui.PY'でアクセスできる変数を宣言する方法はありますか? – dadiletta

+1

kvファイルでは、テンプレートを定義しています。変数はpyファイルで宣言されています。 Kivyパーサーファイルは、kivyファイルのテンプレートに基づいて変数に値を割り当てることができます。 –

関連する問題