@Sladkoeggka

Как получить доступ к нескольким классам Kivy из одного класса внутри стороны Python?

Как в классе CanListener передать в Label класса Monitor, значение 100?
В файле разметки .kv я создаю id класса Monitor и id для label, содержащему нужное мне тектовое поле со значением egt_right.
Однако значение в lebel не удается изменить из класса CanListener, только из класса Monitor.
Класс CanListener предназначен только для вычислений и не является обьектом Screen.
.kv файл 

<CanListener>:
    Monitor:
        id: monitor

<First>:
    
	BoxLayout:
        spacing:50 #spacing=pix между виджетами 
        padding:10 #padding=[отступ горизонтально pix, отступ вертикально pix] 
        orientation:'vertical'
        Image:
            source: 'Logo.png'
            size_hint:(1, .9)
                
<Monitor>:

    egt_right: id_egt_right

        GridLayout:
            BoxLayout:
                orientation:'vertical'
                Label:
                    text:'[color=#999999]EGT RIGHT /[/color][sup]t_egt[/sup]C'
                Label:
                    id: id_egt_right
                    text: '[b][i][color=#cccccc]0[/color][/i][/b]'

<Third>:
    BoxLayout:


файл .py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen

class CanListener(can.Listener):
    def __init__(self, monitor):
        
        #Попытки передачи переменной между классами
        self.parent.ids.monitor.ids.egt_right.text = str(100)
#Загрузка разметки
  
class First(Screen):
    def __init__(self,**kwargs):
        super(First, self).__init__(**kwargs)

class Monitor(Screen):
    egt_right = ObjectProperty(None)

    def __init__(self,**kwargs):
        super(Monitor,self).__init__(**kwargs)


class Third(Screen):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)       

class DashApp(App):
    def build(self):
        sm=ScreenManager()
        sm.add_widget(First(name='first'))
        sm.add_widget(Monitor(name='monitor'))
        sm.add_widget(Third(name='third'))
        return sm


if __name__=="__main__":
    DashApp().run()
  • Вопрос задан
  • 303 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Sladkoeggka Автор вопроса
Причина была в том, что класс CanListener (Далее CL) не имел отношения к ScreenManager (Далее SM).
В дерево виджетов SM его ,соответственно, не включал. Область действия id ограничена правилом, в котором оно обьявлено поэтому из класса CL нельзя получить доступ к id_egt_right. идентификаторы (id) доступны только для родительского обькта, в данном случае это SM. таким образом я указал свойство класса class CanListener(Screen):, добавил его в дерево обьектов:
class DashApp(App):
    def build(self):
        sm=ScreenManager()
        sm.add_widget(CanListener(name='listner'))
        sm.add_widget(First(name='first'))
        sm.add_widget(Monitor(name='monitor'))
        sm.add_widget(Third(name='third'))
        return sm

В CL указал id для класса Monitor. Присовил нужным обьектам свойство ObjectProperty. Теперь ссылки для переменных и label работают между классами
.kv
<b><CanListener>:
    Monitor:
        id: monitor</b>

<First>:
    
  BoxLayout:
        spacing:50 #spacing=pix между виджетами 
        padding:10 #padding=[отступ горизонтально pix, отступ вертикально pix] 
        orientation:'vertical'
        Image:
            source: 'Logo.png'
            size_hint:(1, .9)
                
<Monitor>:

    <b>egt_right: id_egt_right</b>

        GridLayout:
            BoxLayout:
                orientation:'vertical'
                Label:
                    text:'[color=#999999]EGT RIGHT /[/color][sup]t_egt[/sup]C'
                Label:
                    <b>id: id_egt_right</b>
                    text: '[b][i][color=#cccccc]0[/color][/i][/b]'

<Third>:
    BoxLayout:


.py
<b>class CanListener(Screen):</b>
    def __init__(self,**kwargs):
        super(CanListener, self).__init__(**kwargs)
        <b>monitor = ObjectProperty(None)</b>
        
<b>#        self.ids["monitor"].ids['id_egt_right'].text = str(100)
        self.monitor.egt_right.text = str(100)</b>
  
class First(Screen):
    def __init__(self,**kwargs):
        super(First, self).__init__(**kwargs)

class Monitor(Screen):
    <b>egt_right = ObjectProperty(None)</b>

    def __init__(self,**kwargs):
        super(Monitor,self).__init__(**kwargs)


class Third(Screen):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)       
      
class DashApp(App):
    def build(self):
        sm=ScreenManager()
        <b>sm.add_widget(CanListener(name='listner'))</b>
        sm.add_widget(First(name='first'))
        sm.add_widget(Monitor(name='monitor'))
        sm.add_widget(Third(name='third'))
        return sm


if __name__=="__main__": #если запускаем напрямую из консоли
    DashApp().run()


Однако теперь необходимо разобраться с методом super, для корректной работы виджетов
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы