Кнопка Kivy Action не может обновить значок через python

Я делаю приложение, используя python и Raspberry pi, и хотел указать с помощью значка на панели действий, если приложение подключено к Интернету. В методе сборки он постоянно проверяет, подключено ли приложение к Интернету через «Clock.schedule_interval(my_callback.is_connected, 0,5)», вызывая "подключен". Но Я не знаю, как изменить значок, если он подключен внутри метода is_connected.

class Menu(BoxLayout):
    manager = ObjectProperty(None)
    motorBtn = StringProperty()

    def __init__(self, **kwargs):
        super(Menu, self).__init__(**kwargs)
        Window.bind(on_keyboard=self._key_handler)


    def _key_handler(self, instance, key, *args):
        if key is 27:
            self.set_previous_screen()
            return True

    def set_previous_screen(self):
        if self.manager.current != 'home':
            self.manager.transition = SwapTransition()
            self.manager.current = 'home'
    def btn_SwipeSound(self):
        sound = SoundLoader.load('./assest/arrow.wav')
        if sound:

    def is_connected(self,*args):
        motorBtn = StringProperty()
        index = NumericProperty(-1) 

        try:
            # connect to the host -- tells us if the host is actually
            # reachable
            socket.create_connection(("www.google.com", 80))
            self.motorBtn.icon = './assest/usb.jpg

            print ("connected")
            return True  
        except OSError:
            pass
    self.motorBtn.icon = './assest/usb1.jpg
        print("not connected")
        return False


class MenuApp(FlatApp):
    index = NumericProperty(-1) 

    def build(self):
        my_callback=Menu()
        Clock.schedule_interval(my_callback.is_connected, 0.5)
        return Menu()


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

#:kivy 1.10.0
#:import hex kivy.utils.get_color_from_hex
#:import Factory kivy.factory.Factory

<Menu>:
    canvas.before:
        Rectangle:
            pos: self.pos
            size: self.size

    manager: screen_manager
    orientation: "vertical"
    ActionBar:

        size_hint_y: 0.15
        background_image: ''
        background_color: 0.349, 0.584, 0.917, 1
        ActionView:
            ActionPrevious:
                id: actprev
                title: "[b]RheoSb[/b]"
                markup: True
                ##color: 0.105, 0.109, 0.113,1
                font_size: 100
                app_icon: './assest/viclink2.jpg'
                with_previous: False
                on_press: root.set_previous_screen()
                on_press: root.btn_SwipeSound()

            ActionButton:
                id:motorBtn
                text:''
                icon:'./assest/Ethernet.jpg'

    Manager:
        id: screen_manager

<Screen 1>:

<Screen 2>:

<Screen 3>:

<Manager>:

    id: screen_manager
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
216
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема 1. Двойные экземпляры Menu()

Когда ваше приложение запускается, создается два экземпляра class Menu(). Первый экземпляр создается my_callback = Menu(). Второй экземпляр создан return Menu(). Первый экземпляр не имеет связанного с ним модального представления. Кроме того, событие часов запланировано для первого экземпляра. Из-за этого вы не сможете обновить значок.

Решение

def build(self):
    my_callback = Menu()
    Clock.schedule_interval(my_callback.is_connected, 0.5)
    return my_callback

Проблема 2. Обновление значка ActionButton

Проблема была из-за неправильной ссылки/доступа к ActionButton.

Решение

Используйте self.ids.motorBtn.icon

def is_connected(self, *args):
    motorBtn = StringProperty()
    index = NumericProperty(-1)

    try:
        # connect to the host -- tells us if the host is actually
        # reachable
        socket.create_connection(("www.google.com", 80))
        self.ids.motorBtn.icon = './assest/usb.jpg'

        print("connected")
        return True
    except OSError:
        pass
    self.ids.motorBtn.icon = './assest/usb1.jpg'
    print("not connected")
    return False

как всегда ты был моей последней надеждой!! Я сделал такую ​​ошибку новичка! Спасибо!!

Boolean007 10.04.2019 22:28

Другие вопросы по теме