Kivy从pythonsid更新kv代码中的标签

2024-09-22 14:23:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图制作一个有几个屏幕和一个按钮的GUI,这个按钮将从SQLite数据库中获取一些数据,并将其分配给一个标签,以便在GUI屏幕上显示。一般来说,我对kivy、python和面向对象编程还是新手。我试着运行这个程序,它似乎可以很好地获取SQL数据,但是我很难将它分配给我想要显示的标签。我得到的错误是“attribute error:'float'object没有属性'psarjvalue'”,所以我知道它在我的float布局中查找并试图找到psarjvalue,但是没有成功,为什么不呢?我也试着给float布局分配一个id,但是我显然遗漏了一些东西。在

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代码中有我要更新的标签的部分:

^{pr2}$

这是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

标签=自我.psarjvalue是问题发生的地方

我怎么把这个和我的kv标签联系起来? 我试过标签=自我.ids['psarjvalue']和相同的错误

…某个对象属性的东西?在

谢谢你的帮助


Tags: textfromimportselfreleaseinitondef
1条回答
网友
1楼 · 发布于 2024-09-22 14:23:43

编辑:在看到完整的代码之后,问题似乎出在更新标签的方法的调度上。在

Clock.schedule_interval(MimicScreen.updatePSARJ, 1)

由于缺少python库,我无法完全测试您的代码,但也许创建一个将传递给Clock.schedule_intervalMainApp方法将达到相同的目的。(注释或删除原始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)

相关问题 更多 >