Изменение цвета кнопки снаружи корневого класса - PullRequest
0 голосов
/ 09 марта 2019

Я новичок в kivy, и я столкнулся с проблемой, которую не могу найти решение для себя. В основном я хочу изменить цвет кнопки каждый раз, когда я нажимаю F4. Это мой код в основном цикле:

if win32api.GetAsyncKeyState(F4) or F4s == True:
        F4sw = not F4sw
        if F4sw == True:
            ApexDash().recoilon()
        else:
            ApexDash().recoiloff()

И это метод, на который я ссылаюсь, когда F4sw имеет значение True:

class ApexDash(Screen,FloatLayout):

def recoilon(self):
    global F4s
    F4s = True

    print('check')

    self.ids.recoil_on.color = (1,0,0,1)
    self.ids.recoil_off.color = (0,1,0,1)

Таким образом, проблема заключается в том, что всякий раз, когда я нажимаю клавишу F4, проверка печати проходит, как и предполагалось, но кнопка удаления изменяет цвет. Однако они меняют цвета всякий раз, когда я вызываю функцию из файла .kv.

Button:
        id: recoil_on
        background_normal: ''
        text: 'ON'
        on_press: root.recoilon()
        color: 0,1,0,1
        size_hint: 0.1, 0.1
        pos_hint: {"x":0.03, "top":0.65}

Но при выполнении метода извне класса все свойства виджета не работают. Извините, если я пропустил что-то очевидное, любая помощь приветствуется.

1 Ответ

0 голосов
/ 09 марта 2019

При вызове ApexDash() создается новый экземпляр ApexDash, поэтому каждый раз, когда вы вызываете ApexDash().recoilon(), вы создаете новый макет, который нигде не отображается (вам нужно будет позвонить add_widget, чтобы разместить его где-нибудь), изменить его виджеты, а затем молча отказаться от него. Вы должны хранить ссылку на ваш фактический видимый виджет, чтобы манипулировать им, что-то вроде:

if win32api.GetAsyncKeyState(F4) or F4s == True:
        F4sw = not F4sw
        if F4sw == True:
            self.apex_dash.recoilon()
        else:
            self.apex_dash.recoiloff()

или

if win32api.GetAsyncKeyState(F4) or F4s == True:
        F4sw = not F4sw
        if F4sw == True:
            self.ids.apex_dash.recoilon()
        else:
            self.ids.apex_dash.recoiloff()

Я не думаю, что вы должны использовать вызовы win32api вне рамок, Kivy может сам захватывать события клавиатуры (см. здесь ).

Также попробуйте не использовать global в коде Python. Может быть лучше использовать свойство уровня корневого виджета.

...