Невозможно отобразить значения разделения данных из Arduino в окно kivy - PullRequest
2 голосов
/ 01 ноября 2019

Левый столбец представляет данные о температуре, а правый столбец представляет данные о влажности. Я могу разделить данные от Arduino до Python. Но когда я запускаю его в Python, я могу отображать только данные о влажности. Тем не менее, данные о температуре также должны отображаться в середине экрана. Почему данные о температуре не отображаются на экране?

Arduino data from serial monitor

Python program

Воткод на Python:

Файл test.py

import serial
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.properties import StringProperty
from kivy.clock import mainthread
import threading

class NaviWindow(Screen):
    temp_text = StringProperty("")
    humid_text = StringProperty("")

    def __init__(self, **kwargs):
        super(NaviWindow, self).__init__(**kwargs)
        threading.Thread(target=self.tm).start()


    def __init__(self, **kwargs):
        super(NaviWindow, self).__init__(**kwargs)
        threading.Thread(target=self.hm).start()


    def tm(self):
        while (1):
            with serial.Serial('COM4', 9600) as ser:
                data = str(ser.readline().strip().decode('ascii'))
                temp = data.split("|")[0]
                ser.close()
                self.update_temp(temp)

    def hm(self):
        while (2):
            with serial.Serial('COM4', 9600) as ser:
                data = str(ser.readline().strip().decode('ascii'))
                humid = data.split("|")[1]
                ser.close()
                self.update_humid(humid)


    @mainthread
    def update_temp(self, temp):
        self.temp_text = temp

    def update_humid(self, humid):
        self.humid_text = humid


class WindowManager(ScreenManager):
    pass

kys = Builder.load_file("test.kv")

class MyMainApp(App):
    def build(self):
        return kys

if __name__ == "__main__":
    MyMainApp().run()

Файл test.kv

WindowManager:
    NaviWindow:

<NaviWindow>:

    Label:
        size: 75, 50
        size_hint: 1, 1
        text: root.temp_text

    Label:
        size: 75, 50
        size_hint: 0.7, 0.7
        text: root.humid_text

1 Ответ

1 голос
/ 01 ноября 2019

Вы неправильно поняли основы. __init__ определяется два раза, поэтому будет работать только один из них. И вам действительно не нужны два потока, чтобы разбить одну строку на две.

Попробуйте это так:

class NaviWindow(Screen):
    temp_text = StringProperty("")
    humid_text = StringProperty("")

    def __init__(self, **kwargs):
        super(NaviWindow, self).__init__(**kwargs)
        threading.Thread(target=self.tmhm).start()

    def tmhm(self):
        while (1):
            with serial.Serial('COM4', 9600) as ser:
                data = str(ser.readline().strip().decode('ascii'))
                ser.close()
                self.update_values(data.split("|"))


    @mainthread
    def update_values(self, data):
        self.temp_text = data[0]
        self.humid_text = data[1]
...