我试图制作一个有几个屏幕和一个按钮的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']和相同的错误
…某个对象属性的东西?在
谢谢你的帮助
编辑:在看到完整的代码之后,问题似乎出在更新标签的方法的调度上。在
Clock.schedule_interval(MimicScreen.updatePSARJ, 1)
由于缺少python库,我无法完全测试您的代码,但也许创建一个将传递给
Clock.schedule_interval
的MainApp
方法将达到相同的目的。(注释或删除原始Clock.schedule_interval(MimicScreen.updatePSARJ, 1)
)相关问题 更多 >
编程相关推荐