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
Attribute: 'schweben' Objekt hat kein Attribut 'Ids' – Asterlux
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
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