Я знаю, что здесь есть несколько других веток обновления kivy / label, но после нескольких дней применения этих рекомендаций я все еще не приблизился к получению метки в kivy для обновления с данными о температуре от ardunio. Это для панели управления Campervan, которая должна управлять приводами для раскладывания дивана-кровати при нажатии кнопок и отображать данные датчика на экране.
У меня работает соединение через последовательный порт, так как кнопки управления привода работают , но я изо всех сил пытаюсь получить ярлык для обновления с данными датчика температуры. Серийный монитор ardunio IDE показывает, что ardunio выводит температуру в порядке, и если я копирую / вставляю функцию temp_sensor в новый скрипт, он печатает данные в порядке.
Я новичок в программировании, python и Киви, поэтому извиняюсь, если я тупой!
Вот код python:
import kivy
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.properties import ObjectProperty, NumericProperty, StringProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
import serial
import webbrowser
import time
browser_launch = 'https://www.google.com'
ser= serial.Serial('/dev/cu.usbmodem14201', 9600, timeout=5)
class MainWindow(Screen): #The home screen, that navigates to other control windows, and has the buttons controlling the actuators.
desktop = ObjectProperty(None)
settings = ObjectProperty(None)
bed = ObjectProperty(None)
sofa = ObjectProperty(None)
def desktop_button(self):
webbrowser.open_new(browser_launch)
print("Desktop Pressed")
def settings_button(self):
print("Settings Pressed")
def bed_button(self):
ser.write(b'B') #These buttons work, and interact with the ardunio as they should.
print("Bed Pressed")
def sofa_button(self):
ser.write(b'S')
print("Sofa Pressed")
pass
class TempWindow(Screen): #Second screen that is navigated to from the main screen. This will display temperature inside the van, (and outside, plus control the heater eventually)
temp_sensor_inside = NumericProperty(0)
def temp_sensor(self): #If I run this function in a seperate python script it works.
time.sleep(2)
while 1:
temp_reading = ser.readline().decode('ascii')
float_temp = float(temp_reading)
return float_temp
pass
class DataWindow(Screen):
pass
class WindowManager(ScreenManager):
pass
kv = Builder.load_file('my.kv')
class MyMainApp(App):
def build(self):
return kv
if __name__ == "__main__":
MyMainApp().run()
ser.close()
И соответствующая часть .kv файла:
<TempWindow>:
name: 'temp'
temp_sensor_inside: temp_sensor_inside
FloatLayout:
canvas.before:
Rectangle:
pos: self.pos
size: self.size
source: 'background.png'
Label:
id: temp_sensor_inside
text: str(root.temp_sensor())
font_size: 50
pos_hint: {'x': -0.15, 'y': 0.1}