#python #button #kivy #label
#python #кнопка #kivy #ярлык
Вопрос:
Я создал несколько кнопок с метками. Я дал каждому из атрибутов «on_touch_up» с разными функциями. Но когда я нажимаю на одну метку, вызываются все функции. Мне кажется, что область, доступная для просмотра, больше, чем текстура фактической метки. Я попытался установить размер этих меток для разных параметров, таких как «texture_size» или «font_size», но безуспешно.
Спасибо за вашу помощь
<YearLabel@ButtonBehavior Label>
<YearScreen>:
canvas.before:
Color:
rgba: 1,1,1,0.25
Rectangle:
pos: self.pos
size: self.size
canvas.after:
Color:
rgba : 0,0,0,1
Rectangle:
pos: 160,1565
size: 419,60
BoxLayout:
id: years_layout
orientation: "vertical"
pos: 0,-2825
spacing: 380
YearLabel:
text: "2020"
font_size: "150sp"
color: 1,1,1,1
on_touch_up:
root.to_2020()
YearLabel:
text: "2021"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2021()
YearLabel:
text: "2022"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2022()
YearLabel:
text: "2023"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2023()
YearLabel:
text: "2024"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2024()
YearLabel:
text: "2025"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2025()
YearLabel:
text: "2026"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2026()
YearLabel:
text: "2027"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2027()
YearLabel:
text: "2028"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2028()
YearLabel:
text: "2029"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2029()
YearLabel:
text: "2030"
font_size: "150sp"
color: 0,0,0,1
on_touch_up:
root.to_2030()
Ответ №1:
В Kivy события касания распространяются на всех дочерних элементов. Вам нужно ограничить его соответствующим виджетом, используя collide_point
. Ниже приведен пример on_touch_up
правильного определения функции:
on_touch_up:
self.collide_point(*args[1].pos) and root.to_2020()
Аналогично, вы можете определить для остальных меток.
Комментарии:
1. Спасибо за ваш ответ, но у меня это не сработало
2. Извините, пожалуйста, проверьте обновленный ответ. Его следует комбинировать с и, чтобы
root.to_2020()
функция была вложена вcollide_point
метод.3. Я думал, что исправил проблему, но я этого не сделал. Ваше решение работает. Спасибо