私は、いくつかの画面と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
はAttributeError: 'フロート' オブジェクトの完全なコードを見て何の属性 'IDS' – Asterlux
を持っていない、問題は、 '' Clock.schedule_interval(MimicScreen.updatePSARJ、1)であると思われます。このようにして、 'self'属性はScreenオブジェクトの代わりにfloat 1になります。ラベルテキストを定期的に更新する機能をスケジュールしたいと思っています。 – ODiogoSilva
正しいですが、画面上のラベル(実際には複数のラベル)をSQLデータベースの値を表します(これは常に更新されます)。各ラベルをその値と同じ値に更新したいsecond – Asterlux