Доступ к родительским переменным KIVY - PullRequest
0 голосов
/ 28 сентября 2018

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

Код ниже:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty, ListProperty, DictProperty
from kivy.lang import Builder
from kivy.clock import Clock

from os import listdir
import requests
import json

kv_path = './kv/'
for kv in listdir(kv_path):
    Builder.load_file(kv_path + kv)


class MirSniffer(ScreenManager):
    mir_list = ListProperty()
    mir_dict = DictProperty({'MiR_S161': '10.173.175.117',
                         'MiR_S162': '10.173.175.121',
                         'MiR_S319': '10.173.175.120',
                         'MiR_S325': '10.173.175.119',
                         'MiR_S326': '10.173.175.116',
                         'MiR_S327': '10.173.175.118'
                         })

class MiR():
    """Defining a robot class"""

    error = 'Not accessible!'
    mode = 'Not accessible!'
    mission = 'Not accessible!'
    battery_per = 'Not accessible!'
    status = 'Not accessible!'

    def __init__(self, name, ip):
        self.name = name
        self.ip = ip

    def status_check(self):
        url = f"http://{self.ip}/api/v2.0.0/status"

        headers = {
            'Content-Type': "application/json",
            'authorization': "Basic YWRtaW46OGM2OTc2ZTViNTQxMDQxNWJkZTkwOGJkNGRlZTE1ZGZiMTY3YTljODczZmM0YmI4YTgxZjZmMmFiNDQ4YTkxOA==",
            'Cache-Control': "no-cache",
            'Postman-Token': "bfcd7159-1d12-5b7f-468f-d5e096709cbd"
        }

        response = requests.request("GET", url, headers=headers, timeout=2)
        text = json.loads(response.text)  # str to dict

        self.error = text["errors"][0]["description"]
        self.battery_per = text.get("battery_percentage")
        self.mission = text.get("mission_text")
        self.mode = text.get("mode_text")
        self.status = text.get("state_text")

    def creating_robots_list(mir_list, mir_dict):
        """Creating list of robots. Called once"""
        for key in mir_dict.keys():
            robot = MiR(key, mir_dict.get(key))
            mir_list.append(robot)

    def __init__(self, **kwargs):
        super(MainScreen, self).__init__(**kwargs)
        Clock.schedule_interval(self.creating_robots_list(self.mir_list, 
        self.mir_dict), 10)

class MainScreen(Screen):


        status_mir161 = StringProperty('0')

        def __init__(self, **kwargs):
            super(MainScreen, self).__init__(**kwargs)
            Clock.schedule_interval(self.change_robot_status, 5)

        def change_robot_status(self, *args):
            test_string = self.status_mir161 + '1'
            self.status_mir161 = test_string


class Mir161(Screen):
    pass


class MainApp(App):
    def build(self):
        return MirSniffer()


if __name__ == '__main__':
     MainApp().run()

Если я хочу изменить self.status_mir161 в соответствии сmir_list - какой у него синтаксис?

Я не уверен, даже если создание списка объектов в родительском виджете - правильный подход.

1 Ответ

0 голосов
/ 29 сентября 2018

Я не получил ваш файл KV, но если вы просто хотите получить доступ к значениям ScreenManager, которые вы определили, то сначала получите родителя ребенка, так что ... на вашем MainScreen:

parent = self.parent

Тогда, если этот родитель - ScreenManager, вы можете сделать что-то вроде:

target_dict = parent.mir_dict

Я не проверял это, но попробуйте это, тогда мы можем взять его оттуда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...