Почему значения, хранящиеся в моем файле JSON, не меняются? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть кнопки, которые связаны с ключами в моем файле JSON.С помощью модуля часов kivy я проверяю значение, связанное с кнопкой, и меняю ее цвет.Когда кнопка становится красной, я хочу, чтобы ее значение score стало 0 и было сохранено в файле json.Когда в файле json сохранено несколько кнопок, счет не обнуляется до тех пор, пока я не нажму одну из кнопок, и когда я нажму кнопку, все значения, кроме первой кнопки, повернутой в 0, это не то, что я хочу.

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):

        for child in reversed(self.root.screen_two.ids.streak_zone.children):
            name = child.text

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

            for key in data.keys():
                if key == name:
                    delay = data.get(key, {}).get('delay')  # get value of nested key 'delay'
                    self.honey = data[key]['delta']
                    float(self.honey)


                if delay > time.time() < self.honey:  # early (yellow)
                    child.background_normal = ''
                    child.background_color = [1, 1, 0, 1]
                    child.unbind(on_press=self.add_score)
                    child.bind(on_press=self.early_click)

                elif delay > time.time() > self.honey:  # on time (green)
                    child.background_normal = ''
                    child.background_color = [0, 1, 0, 1]
                    child.unbind(on_press=self.early_click)
                    child.bind(on_press=self.add_score)

                elif delay < time.time() > self.honey:  # late (red)
                    child.background_normal = ''
                    child.background_color = [1, 0, 0, 1]
                    child.unbind(on_press=self.add_score)
                    child.unbind(on_press=self.early_click)

                    with open("streak.json", "r+") as f:
                        files = json.load(f)
                        files[child.text]['score'] = 0
                        f.seek(0)
                        json.dump(files, f, indent=4)
                        f.truncate()

json file:

{
    "One": {
        "action": "One",
        "delay": 1558740875.58999,
        "seconds": 60,
        "score": 3,
        "delta": 1558740815.58999,
        "grace_sec": 120
    },
    "Two": {
        "action": "Two",
        "delay": 1558740752.0085213,
        "seconds": 60,
        "score": 0,
        "delta": 1558740692.0085213,
        "grace_sec": 120
    },
    "Three": {
        "action": "Three",
        "delay": 1558746820.4364505,
        "seconds": 60,
        "score": 0,
        "delta": 1558740820.4364505,
        "grace_sec": 6060
    }
}

Я хочу, чтобы только красная кнопка меняла score на 0, но и Two и Three меняются, даже если только Two был красным.Кроме того, оценка меняется только когда я нажимаю зеленую кнопку, в данном случае это было One.Это не то, что я хочу.Я хочу, чтобы счет обновлялся самостоятельно с помощью модуля Clock.

Ответы [ 2 ]

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

создал отдельную функцию, которая использует часы для обновления файла JSON.

# change score to 0 and stores in json file
    def score_gone(self, dt):
        for child in self.root.screen_two.ids.streak_zone.children:
            name = child.text
            color = child.background_color

            with open("streak.json", "r") as file:
                read = json.load(file)

            if color == [1, 0, 0, .95]: # red

                if read[name]['score'] != 0: #stops slow down from Clock
                    with open("streak.json", "r+") as f: # fix score not reseting to 0
                            data = json.load(f)
                            data[name]['score'] = 0
                            f.seek(0)
                            json.dump(data, f, indent=4)
                            f.truncate()

                elif read[name]['score'] == 0: #stops slow down from Clock
                        pass
0 голосов
/ 25 мая 2019

случай 1: я думаю, что time.time () всегда больше и задержки, и меда, и каждый раз входит в третье условие и устанавливает счет в ноль.

Другой вариант: просто следите за всеми красными кнопками в списке, повторяйте их и обновляйте файл json сразу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...