Как использовать часы Kivy для изменения цвета кнопок? - PullRequest
1 голос
/ 30 апреля 2019

Я хочу, чтобы моя программа сравнивала время, сохраненное в кнопке, с текущим временем. Кнопка должна изменить желтый цвет, если «рано», зеленый, если «вовремя», и красный, если «поздно». Когда я запускаю программу, я получаю эту ошибку:

     honey = float(self.streak_button.id)
 AttributeError: 'MainApp' object has no attribute 'streak_button'

Это мой код:

class MainApp(App):

    def build(self): # build() returns an instance
        self.store = JsonStore("streak.json") # file that stores the streaks:
        Clock.schedule_interval(self.check_streak, 1/30.)

        return presentation


    def check_streak(self, dt):
        honey = float(self.streak_button.id)
        #print(f"\tdelta={honey}")

        # used to give 30 minute grace period
        delay = honey + 1800
        check = False

        if honey > time.time() and honey < delay:
            check = True

        if honey > time.time():
            self.streak_button.color = 0,1,0

        if check == True:
            self.streak_button.color = 0,0,1

        if honey < time.time():
            self.streak_button.color = 1,0,0

def display_btn(self):
        # display the names of the streaks in a list on PageTwo
        with open("streak.json", "r") as read_file:
            data = json.load(read_file)

        for value in data.values():
            if value['delta'] is not None:
                print(f"action={value['action']}, delta={value['delta']}")
                self.streak_button = StreakButton(id=str(value['delta']), text=value['action'],
                                            on_press=self.third_screen)
                self.root.screen_two.ids.streak_zone.add_widget(self.streak_button)

1 Ответ

0 голосов
/ 02 мая 2019

Для изменения цвета кнопки используйте следующее:

  • background_normal = '' # Чтобы установить простой цвет
  • background_color = [1, 0, 0, 1] # Цвет фона в формате (r, g, b, a)

Kivy Button »background_color

background_color

Цвет фона в формате (r, g, b, a).

Действует как множитель для цвета текстуры. Текстура по умолчанию серый, поэтому просто установка цвета фона даст более темный результат. Чтобы установить простой цвет, установите background_normal на ''.

background_color является ListProperty и по умолчанию [1, 1, 1, 1].

Пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import Screen
from kivy.uix.button import Button
from kivy.storage.jsonstore import JsonStore
from kivy.lang import Builder
from kivy.clock import Clock

import time
import json


class ScreenTwo(Screen):
    pass


Builder.load_string("""
<ScreenTwo>:
    GridLayout:
        id: streak_zone
        cols: 2
""")


class StreakButton(Button):
    # rgba = ListProperty([])

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            print(f"\nCustomButton.on_touch_down: text={self.text}")
            self.dispatch('on_press')
            return True
        return super(StreakButton, self).on_touch_down(touch)


class TestApp(App):
    def build(self):
        self.store = JsonStore("streak.json")
        Clock.schedule_interval(self.check_streak, 1/30.)

        return ScreenTwo()

    def check_streak(self, dt):
        print(f"\ncheck_streak:")

        # check all buttons
        for child in reversed(self.root.ids.streak_zone.children):
            honey = float(child.id)
            print(f"\tdelta={honey}")

            # used to give 30 minute grace period
            delay = honey + 1800
            check = False

            if honey > time.time() and honey < delay:
                check = True

            if honey > time.time():
                print("\t\tearly")
                child.background_normal = ''
                child.background_color = [1, 1, 0, 1]    # Yellow colour

            elif check == True:
                print("\t\ton time")
                child.background_normal = ''
                child.background_color = [0, 1, 0, 1]    # Green colour

            elif honey < time.time():
                print("\t\tlate")
                child.background_normal = ''
                child.background_color = [1, 0, 0, 1]    # Red colour

    def display_btn(self):
        print(f"\ndisplay_btn:")

        with open("streak.json", "r") as read_file:
            data = json.load(read_file)

            for value in data.values():
                if value['delta'] is not None:
                    print(f"action={value['action']}, delta={value['delta']}")
                    streak_button = StreakButton(id=str(value['delta']), text=value['action'], on_press=self.third_screen)
                    self.root.ids.streak_zone.add_widget(streak_button)


if __name__ == '__main__':
    TestApp().run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...