Кнопка переключения, чтобы изменить свойства чего-то вне его класса - Kivy - PullRequest
0 голосов
/ 11 апреля 2019

Поэтому у меня возникли проблемы с пониманием того, как изменить цвет кнопки, которая находится на другом экране, по сравнению с кнопкой, которая меняет цвет этой кнопки (извините, если это трудно понять).Я довольно новичок в python и действительно новичок в Kivy, поэтому я постараюсь объяснить это как можно лучше.

В <ChannelOneWindow> у меня есть enableSwitchOne ToggleButton, который меняет свой цвет и colourMarkerOne через оператор if.Мне также нужно включить enableSwitchOne, чтобы изменить цвет colourMarker1 в <HomeWindow>.Я понимаю, что это, вероятно, делается связыванием, но фреймворк Kivy недостаточно хорошо документирован, и мне очень тяжело с этим работать.Кто-нибудь может помочь?

.kv Файл -

#: import sm kivy.uix.screenmanager

WindowManager:
    HomeWindow:
    ChannelOneWindow:



<HomeWindow>:
    name: "home"

    FloatLayout:


        Button:
            pos_hint:{"x":0.0,"y":0.70}
            size_hint: 1.0, 0.2
            font_size: (root.width**2 + root.height**2) / 12**4
            background_normal: '0'
            id: armSwitch
            text: "SAFE"
            background_color: 0, 1, 0, 1
            on_press:
                root.updateText()
                root.updateColour()
                print("Sending To FPGA")




        Button:
            pos_hint:{"x":0,"y":0}
            size_hint: 0.16, 0.17
            font_size: (root.width**2 + root.height**2) / 14**4 #14**4
            text: "1"   
            on_release:
                root.manager.transition.direction = "left"
                root.channeloneBtn()





        ToggleButton:
            pos_hint:{"x":0,"y":0.17}
            size_hint: 0.16, 0.05
            id: colourMarker1
            font_size: (root.width**2 + root.height**2) / 14**4
            background_color: 5, 0, 0, 1            


<ChannelOneWindow>:
    name: "channelone"

    FloatLayout:

        Button:
            pos_hint:{"x":0.0,"y":0.90}
            size_hint: 0.20, 0.09
            font_size: (root.width**2 + root.height**2) / 15**4
            text: "Home"
            on_release:
                root.manager.transition.direction = "right" 
                root.homeBtn()  

        TextInput:
            font_size: (root.width**2 + root.height**2) / 15**4
            multiline: False
            pos_hint: {"x":0.20, "y":0.91}
            size_hint: 0.2, 0.08                    


        ToggleButton:
            pos_hint:{"x":0.35,"y":0.30}
            size_hint: 0.30, 0.10
            font_size: (root.width**2 + root.height**2) / 14**4
            background_normal: '0'
            id: enableSwitchOne
            text: "DISABLED"
            background_color: 1, 0, 0, 1
            on_state: 
                root.Enabled(*args)


        Button:
            pos_hint:{"x":0,"y":0}
            size_hint: 0.16, 0.17
            font_size: (root.width**2 + root.height**2) / 14**4 #14**4
            text: "1"   





        ToggleButton:
            pos_hint:{"x":0,"y":0.17}
            size_hint: 0.16, 0.05
            background_normal: '0'
            id: colourMarkerOne
            font_size: (root.width**2 + root.height**2) / 14**4
            background_color: 1, 0, 0, 1
            on_state: 
                root.Enabled(*args)



'''''''

.py Файл -

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import NumericProperty
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.uix.label import Label



class HomeWindow (Screen):
    name = ObjectProperty(None)
    c = NumericProperty(0)


    def updateText(self):
        self.ids.armSwitch.text="ARMED"
    def updateColour(self):
        self.ids.armSwitch.background_color= 1, 0, 0, 1

    def channeloneBtn(self):
        self.reset()
        sm.current = "channelone"



    def reset(self):
          pass


class ChannelOneWindow (Screen):
    name = ObjectProperty(None)
    c = NumericProperty(0)




    def Enabled(self, *args):
        if args[1]=='down':
            self.Status = "Device on"
            self.ids.enableSwitchOne.background_color= 0, 1, 0, 1
            self.ids.colourMarkerOne.background_color= 0, 1, 0, 1
            self.ids.enableSwitchOne.text="ENABLED"

            print("Channel 1 Enabled")
            c = 1
        else:
            self.Status = "Device off"
            self.ids.enableSwitchOne.background_color= 1, 0, 0, 1
            self.ids.colourMarkerOne.background_color= 1, 0, 0, 1
            self.ids.enableSwitchOne.text="DISABLED"
            print("Channel 1 Disabled")
            c = 0


    def homeBtn(self):
        self.reset()
        sm.current = "home"



    def reset(self):
        pass



class WindowManager(ScreenManager):
    pass



kv = Builder.load_file("buzzcut.kv")

sm = WindowManager()


screens = [HomeWindow(name="home"),ChannelOneWindow(name="channelone") ]
for screen in screens:
    sm.add_widget(screen)


    sm.current = "home"

class BuzzcutApp(App):
    def build(self):
        return sm

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

'' '' ''

Дайте мне знать, если больше информациинужен, и я сделаю все возможное.

1 Ответ

0 голосов
/ 11 апреля 2019

Использовать self.manager.get_screen("home")

self.manager.get_screen("home").ids.colourMarker1.background_color

Kivy ScreenManager »get_screen

get_screen(name)

Возвращать виджет экрана, связанный с именем, или вызывать исключение ScreenManagerExceptionесли не найден.

Фрагменты

class ChannelOneWindow(Screen):
    name = ObjectProperty(None)
    c = NumericProperty(0)

    def Enabled(self, *args):
        if args[1] == 'down':
            self.Status = "Device on"
            self.ids.enableSwitchOne.background_color = 0, 1, 0, 1
            self.ids.colourMarkerOne.background_color = 0, 1, 0, 1
            self.ids.enableSwitchOne.text = "ENABLED"
            self.manager.get_screen("home").ids.colourMarker1.background_color = 0, 1, 0, 1

            print("Channel 1 Enabled")
            c = 1
        else:
            self.Status = "Device off"
            self.ids.enableSwitchOne.background_color = 1, 0, 0, 1
            self.ids.colourMarkerOne.background_color = 1, 0, 0, 1
            self.ids.enableSwitchOne.text = "DISABLED"
            self.manager.get_screen("home").ids.colourMarker1.background_color = 1, 0, 0, 1
            print("Channel 1 Disabled")
            c = 0
...