Kivy, если кнопка нажата в течение определенного времени, делает это

#python #kivy

#python #kivy

Вопрос:

Я хочу проверить, как регистрируется нажатие / нажатие кнопки (YearLabel). Если кнопка нажата в течение определенного времени, я не хочу выполнять логику в функции «to_2020».

Как я могу этого добиться? Спасибо

Python:

   def on_touch_down(self, touch):
        # if button is pressed for this time don't execute "to_2020"-logic

    def to_2020(self):
        layout = self.ids.years_layout
        anim_to_2020 = Animation(pos=(0,-2900),duration=0.25)
        label_2020 = self.ids.label_2020
        anim_white_2020 = Animation(color=(1,1,1,1),duration=0.25)
        anim_to_2020.start(layout)
        anim_white_2020.start(label_2020)
  

Kv:

         YearLabel:
            id: label_2020
            text: "2020"
            font_size: "150sp"
            color: 1,1,1,1
            on_touch_down:
                self.collide_point(*args[1].pos) and root.on_touch_down()
            on_touch_up:
                self.collide_point(*args[1].pos) and root.to_2020()


  

Комментарии:

1. вы имеете в виду, как долго?

Ответ №1:

Вы можете выполнить то, что, я полагаю, вы хотите, записав время on_touch_down события и используя это в on_touch_up() методе, чтобы определить, следует ли вызывать to_2020() метод. Если вы не можете изменить YearLabel класс, возможно, вы можете расширить его следующим образом:

 class MyYearLabel(YearLabel):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.time = time()
        return super(MyYearLabel, self).on_touch_down(touch)

    def on_touch_up(self, touch):
        if self.collide_point(*touch.pos):
            length_of_press = time() - self.time
            if length_of_press > 2:
                self.to_2020()
        return super(MyYearLabel, self).on_touch_up(touch)

    def to_2020(self):
        layout = self.ids.years_layout
        anim_to_2020 = Animation(pos=(0, -2900), duration=0.25)
        label_2020 = self.ids.label_2020
        anim_white_2020 = Animation(color=(1, 1, 1, 1), duration=0.25)
        anim_to_2020.start(layout)
        anim_white_2020.start(label_2020)
  

и в ‘kv’:

 MyYearLabel:
    id: label_2020
    text: "2020"
    font_size: "150sp"
    color: 1,1,1,1
  

Методы on_touch_down() и on_touch_up() вызываются для вас kivy, поэтому вам не нужно упоминать их в kv .

Комментарии:

1. Спасибо за ваш ответ. «YearLabel» — это не мой класс, у меня есть класс screen, и в этом классе есть «year_label». Я попытался получить доступ к «year labe»l в супер-инструкции с идентификатором, но безуспешно. Как я могу получить доступ к метке в классе экрана. Спасибо

2. Можете ли вы изменить kv это YearLabel правило?

3. Да, что бы вы порекомендовали?

4. Смотрите мой измененный ответ.

5. Хорошо, спасибо. Есть ли какой-либо способ, которым я все еще могу сделать это с помощью класса Screen?