简体   繁体   English

为什么我的if和elif语句一次只能用于一个按钮?

[英]Why does my if and elif statements only work for one button at a time?

I have my program display a list of buttons stored in a json file. 我让程序显示存储在json文件中的按钮列表。 I have each button's stored time, honey , compared to the current time, time.time() and the delay that the user inputs. 与当前时间time.time()和用户输入的delay相比,我具有每个按钮的存储时间honey

For some reason the conditional only works when there is one button. 由于某些原因,条件条件仅在有一个按钮时才起作用。 Once I add an additional button the program turns the first button green to indicate its early and the new button turns yellow to indicate that it is early. 一旦添加了其他按钮,程序将第一个按钮变为绿色以指示其为早,而新按钮变为黄色以指示其为早期。 Once the new button turns red the first button turns red as well. 新按钮变成红色后,第一个按钮也变成红色。

I have timed the program and the program runs at the correct time. 我已经为程序计时,并且程序在正确的时间运行。 Why am I having this problem and how would I fix it? 为什么会有这个问题,我该如何解决? Code: 码:

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):
            honey = float(child.id)

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

            for value in data.values():
                if value['delay'] is not None:
                    delay = int(value['delay'])

                    if delay > time.time() < honey: # early (yellow)
                        child.background_normal = ''
                        child.background_color = [1, 1, 0, 1]

                    elif delay > time.time() > honey: # on time (green)
                        child.background_normal = ''
                        child.background_color = [0, 1, 0, 1]


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

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']}, grace={value['delay']}")
                streak_button = StreakButton(id=str(value['delta']), text=value['action'],
                                            on_press=self.third_screen, size=(400,50),
                                            size_hint=(None,None))
                self.root.screen_two.ids.streak_zone.add_widget(streak_button)

total = ((int(self.streak.day) * 86400) + (int(self.streak.hour) * 3600) +
                    (int(self.streak.minute) * 60)) # convert into seconds

            self.current_time = time.time()
            self.count = self.current_time + total
            grace = (int(self.streak.delay) * 60) + self.count # aka delay

            parsed = True

            # delete later just used to test
            print("[seconds:", total,']' , "[action:", self.streak.action,']',
                 "[grace:", grace,']')

            # store streak attributes inside "streak.json"
            self.store.put(self.streak.action, action=self.streak.action,
                          delay=grace, seconds=total,
                          score=0, delta=self.count)

streak.json file: {"one": {"action": "one", "delay": 1557095861.2131674, "seconds": 60, "score": 0, "delta": 1557095801.2131674}, "two": {"action": "two", "delay": 1557096131.7338686, "seconds": 60, "score": 0, "delta": 1557096071.7338686}} streak.json文件: {"one": {"action": "one", "delay": 1557095861.2131674, "seconds": 60, "score": 0, "delta": 1557095801.2131674}, "two": {"action": "two", "delay": 1557096131.7338686, "seconds": 60, "score": 0, "delta": 1557096071.7338686}}

It works for only one button because the if...elif statements are outside the for loop. 它仅适用于一个按钮,因为if...elif语句在for循环之外。

Solution

Move the if...elif block into the if value['delay'] is not None: block inside the for loop. if...elif块移至if value['delay'] is not None: for循环内的块。

Snippets 片段

def check_streak(self, dt):

    for child in reversed(self.root.screen_two.ids.streak_zone.children):
        honey = float(child.id)

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

        for value in data.values():
            if value['delay'] is not None:
                delay = int(value['delay'])

                # fix for later
                if delay > time.time() < honey: # early (yellow)
                    child.background_normal = ''
                    child.background_color = [1, 1, 0, 1]

                elif delay > time.time() > honey: # on time (green)
                    child.background_normal = ''
                    child.background_color = [0, 1, 0, 1]

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

The problem was that having two loops caused my data to get mismatched. 问题是有两个循环导致我的数据不匹配。 I needed to be able to either iterate over the button objects and only use the correct json file dictionary entry for each, or iterate over the json file and only modify the corresponding child. 我需要能够遍历按钮对象并仅对每个对象使用正确的json文件字典条目,或者遍历json文件并仅修改相应的子对象。 I decided to use the former. 我决定使用前者。

I set up the code so that for every child in the streak_zone name = child.text 我设置了代码,以便在streak_zone name = child.text中的每个孩子name = child.text

I then compare every key in my json file to the name of the button aka child 然后,我将json文件中的每个键与按钮的名称(也就是child

if the name of the key is equal to name then we get the value of the nested key delay 如果键的名称等于name那么我们得到嵌套键delay的值

New code: 新代码:

def check_streak(self, dt):

        for child in reversed(self.root.screen_two.ids.streak_zone.children):
            honey = float(child.id)
            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')


                if delay > time.time() < honey: # early (yellow)
                    child.background_normal = ''
                    child.background_color = [1, 1, 0, 1]

                elif delay > time.time() > honey: # on time (green)
                    child.background_normal = ''
                    child.background_color = [0, 1, 0, 1]


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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM