2016-11-15 9 views
1

Ich versuche, eine GUI mit ein paar Bildschirmen und eine Schaltfläche, die einige Daten aus einer SQLite-Datenbank abrufen und zuweisen, um eine Bezeichnung auf dem GUI-Bildschirm angezeigt werden . Ich bin immer noch neu in Kivy, Python und objektorientierter Programmierung. Ich versuche, das auszuführen, und es scheint zu funktionieren, um die SQL-Daten abzurufen, aber ich habe Probleme, es dem Etikett zuzuweisen, das ich anzeigen möchte. Der Fehler, den ich bekomme, ist "Attributfehler: 'float' Objekt hat kein Attribut 'psarjvalue'", also verstehe ich, dass es in meinem Float-Layout sucht und versucht, psarjvalue zu finden, aber nicht erfolgreich ist, warum nicht? Ich habe auch versucht, dem Float-Layout eine ID zuzuordnen, aber mir fehlt eindeutig etwas.Kivy - Aktualisieren von Label in KV-Code von Python Seite

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() 

Dies ist der Teil des kv-Code, der das Etikett I zu aktualisierenden hat:

<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 

Und dies ist der relevante Teil der Python-Seite

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 ist, wo das Problem auftritt

Wie verknüpfe ich das mit meinem KV-Label? Ich habe versucht Label = self.ids ['Psarjvalue'] und den gleichen Fehler

... etwas etwas Objekteigenschaften?

Vielen Dank für jede Hilfe

Antwort

1

EDITED: Nach dem vollständigen Code zu sehen, scheinen die Probleme auf der Terminierung des Verfahrens zu sein, die die Etiketten aktualisiert.

Clock.schedule_interval(MimicScreen.updatePSARJ, 1)

Ich kann Ihren Code nicht vollständig testen aufgrund Python Libs fehlt, aber vielleicht ein MainApp Verfahren zu schaffen, die Clock.schedule_interval weitergegeben wird das gleiche Ziel erreichen. (Kommentar oder das Original Clock.schedule_interval(MimicScreen.updatePSARJ, 1) entfernen)

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

Attribute: 'schweben' Objekt hat kein Attribut 'Ids' – Asterlux

+0

den vollständigen Code sehen, das Problem in 'Clock.schedule_interval zu sein scheint (MimicScreen.updatePSARJ, 1)' . Auf diese Weise wird das Attribut "self" zum float 1 anstelle des Screen-Objekts. Von was ich sehe, möchten Sie eine Funktion planen, die den Etikettentext regelmäßig aktualisiert, ja? – ODiogoSilva

+0

Richtig, ich hätte gerne ein Etikett (mehrere Etiketten tatsächlich) auf einem Bildschirm jeder repräsentieren einen Wert aus meiner SQL-Datenbank (die ständig aktualisiert wird), so dass ich möchte, dass jedes Etikett auf diesen Wert etwa einmal aktualisieren zweite – Asterlux