2016-11-15 31 views
1

私は、いくつかの画面とSQLiteデータベースからいくつかのデータをフェッチし、GUI画面に表示されるラベルに割り当てるボタンでGUIを作ろうとしています。私はまだ、kivy、Python、そしてオブジェクト指向のプログラミングには新しいことが一般的です。私はこれを実行しようとすると、それはSQLデータをフェッチするために正常に動作するようだが、私は表示したいラベルに割り当てるのに問題があります。私が得るエラーは「属性エラー: 'float'オブジェクトに属性 'psarjvalue'がありません」ということです。フロートレイアウトを探してpsarjvalueを検索しようとしていますが、成功していません。私も浮動小数点数のレイアウトにIDを割り当てることを試みたが、私は明らかに何かを欠いている。Kivy - Python側からkvコードのラベルを更新する

import kivy 
import sqlite3 
import sched, time 
import smbus 
import time 
from Naked.toolshed.shell import execute_js, muterun_js 
import os 
import signal 
import multiprocessing, signal 
from kivy.uix.behaviors.button import ButtonBehavior 
from kivy.uix.button import Button 
from kivy.app import App 
from kivy.uix.label import Label 
from kivy.uix.widget import Widget 
from kivy.base import runTouchApp 
from kivy.clock import Clock 
from kivy.properties import ListProperty 
from kivy.vector import Vector 
from kivy.core.window import Window 
from kivy.lang import Builder 
from kivy.uix.floatlayout import FloatLayout 
from kivy.uix.boxlayout import BoxLayout 
from kivy.uix.gridlayout import GridLayout 
from kivy.uix.stacklayout import StackLayout 
from kivy.core.image import Image 
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition, WipeTransition, SwapTransition 

bus = smbus.SMBus(1) 
address = 0x04 

psarj = 0.00 

p = multiprocessing.Process(target = muterun_js,args=('iss_telemetry.js',)) 

conn = sqlite3.connect('iss_telemetry.db') 
c = conn.cursor() 

class MainScreen(Screen): 
    def __init__(self, **kwargs): 
     super(MainScreen, self).__init__(**kwargs) 

class CalibrateScreen(Screen): 
    pass 

class ManualControlScreen(Screen): 
    def __init__(self, **kwargs): 
     super(ManualControlScreen, self).__init__(**kwargs) 

class MimicScreen(Screen): 
    def __init__(self, **kwargs): 
     super(MimicScreen, self).__init__(**kwargs) 

    def updatePSARJ(self, *args, **kwargs): 
     c.execute('SELECT two FROM telemetry where one="psarj"') 
     psarj = c.fetchone() 
     label = self.psarjvalue 
     label.text = psarj 

     # self.psarjvalue.text = psarj 

class MainScreenManager(ScreenManager): 
    pass 

#def updatePSARJ(*args): 
# c.execute('SELECT two FROM telemetry where one="psarj"') 
# psarj = c.fetchone() 
# MimicScreen.psarjlabel.text = psarj 

class MainApp(App): 
    def build(self): 
     root = ScreenManager(transition=WipeTransition()) 
     root.add_widget(MainScreen(name = 'main')) 
     root.add_widget(CalibrateScreen(name = 'calibrate')) 
     root.add_widget(MimicScreen(name = 'mimic')) 
     root.add_widget(ManualControlScreen(name = 'manualcontrol')) 
     root.current= 'main' 
     return root 

    def startTelemetry(*kwargs): 
     p.start() 

    def stopTelemetry(*kwargs): 
     os.kill(p.pid,signal.SIGKILL) 

#def update_values(*args): 
# c.execute('SELECT two FROM telemetry where one="psarj"') 
# psarj = c.fetchone() 
# MimicScreen.updatePSARJ() 

Clock.schedule_interval(MimicScreen.updatePSARJ, 1) 

Builder.load_string(''' 
#:kivy 1.8 
#:import kivy kivy 
#:import win kivy.core.window 

<MimicScreen>: 
    name: 'mimic' 
    FloatLayout: 
     id: mimicscreenlayout 
     Image: 
      source: 'iss1.png' 
      allow_stretch: True 
      keep_ratio: False 
     Label: 
      id: psarjvalue 
      pos_hint: {"center_x": 0.7, "center_y": 0.5} 
      text: '0.003' 
      markup: True 
      color: 1,1,1 
      font_size: 60 
     Label: 
      id: telemetrystatus 
      pos_hint: {"center_x": 0.6, "center_y": 0.8} 
      text: 'Telemetry' 
      markup: True 
      color: 1,0,1 
      font_size: 60 
     Button: 
      id: mimicstartbutton 
      size_hint: 0.3,0.1 
      pos_hint: {"x": 0.1, "y": 0.6} 
      text: 'MIMIC' 
      disabled: False 
      font_size: 30 
      on_release: telemetrystatus.text = 'Fetching Telemetry...' 
      on_release: app.startTelemetry() 
      on_release: mimicstopbutton.disabled = False 
      on_release: mimicstartbutton.disabled = True 
     Button: 
      id: mimicstopbutton 
      size_hint: 0.3,0.1 
      pos_hint: {"x": 0.1, "y": 0.4} 
      text: 'Stop' 
      disabled: True 
      font_size: 30 
      on_release: telemetrystatus.text = 'Program Stopped' 
      on_release: app.stopTelemetry() 
      on_release: mimicstopbutton.disabled = True 
      on_release: mimicstartbutton.disabled = False 
     Button: 
      size_hint: 0.3,0.1 
      pos_hint: {"Left": 1, "Bottom": 1} 
      text: 'Return' 
      font_size: 30 
      on_release: root.manager.current = 'main' 

''') 

if __name__ == '__main__': 
    MainApp().run() 

これは私が更新したいラベルがあるKVコードの一部です:

<MimicScreen>: 
    name: 'mimic' 
    FloatLayout: 
     id: mimicscreenlayout 
     Image: 
      source: 'iss1.png' 
      allow_stretch: True 
      keep_ratio: False 
     Label: 
      id: psarjvalue 
      pos_hint: {"center_x": 0.7, "center_y": 0.5} 
      text: '0.003' 
      markup: True 
      color: 1,1,1 
      font_size: 60 

をそして、これは、Python側

conn = sqlite3.connect('iss_telemetry.db') 
c = conn.cursor() 

class MimicScreen(Screen): 
    def __init__(self, **kwargs): 
     super(MimicScreen, self).__init__(**kwargs) 

    def updatePSARJ(self, *args, **kwargs): 
     c.execute('SELECT two FROM telemetry where one="psarj"') 
     psarj = c.fetchone() 
     label = self.psarjvalue 
     label.text = psarj 
の関連する部分である

label = self.psarjvalueは問題が発生する場所です

これをkvラベルにリンクするにはどうすればいいですか? 私はlabel = self.ids ['psarjvalue']と同じエラーを試しました

...何か何かオブジェクトのプロパティですか?任意のヘルプEDITED

答えて

1

ため

ありがとう:完全なコードを見た後、問題がラベルを更新するメソッドのスケジューリングにあると思われます。

Clock.schedule_interval(MimicScreen.updatePSARJ, 1)

私は完全に欠落している原因のpython LIBSにあなたのコードをテストすることはできませんが、おそらくClock.schedule_intervalに渡されるMainAppメソッドを作成すると、同じ目的を達成します。 (元Clock.schedule_interval(MimicScreen.updatePSARJ, 1)コメントまたは削除)

MainApp(App): 
    def build(self): 
     # Create attribute that will be used to reference labels 
     self.m_screen = MimicScreen(name = 'mimic') 
     root = ScreenManager(transition=WipeTransition()) 
     root.add_widget(MainScreen(name = 'main')) 
     root.add_widget(CalibrateScreen(name = 'calibrate')) 
     # Provide the above created attribute instead of creating a new instance 
     root.add_widget(self.m_screen) 
     root.add_widget(ManualControlScreen(name = 'manualcontrol')) 
     root.current= 'main' 

     # Put the schedule function here, and reference the new function defined below 
     Clock.schedule_interval(self.update_labels, 1) 
     return root 

    # This method will periodically update the label text 
    def update_labels(self, dt): 
     c.execute('SELECT two FROM telemetry where one="psarj"') 
     psarj = c.fetchone() 
     self.m_screen.ids.psarjvalue.text = psarj 

    def startTelemetry(*kwargs): 
     p.start() 

    def stopTelemetry(*kwargs): 
     os.kill(p.pid,signal.SIGKILL) 
+0

はAttributeError: 'フロート' オブジェクトの完全なコードを見て何の属性 'IDS' – Asterlux

+0

を持っていない、問題は、 '' Clock.schedule_interval(MimicScreen.updatePSARJ、1)であると思われます。このようにして、 'self'属性はScreenオブジェクトの代わりにfloat 1になります。ラベルテキストを定期的に更新する機能をスケジュールしたいと思っています。 – ODiogoSilva

+0

正しいですが、画面上のラベル(実際には複数のラベル)をSQLデータベースの値を表します(これは常に更新されます)。各ラベルをその値と同じ値に更新したいsecond – Asterlux

関連する問題