Изменение цвета нескольких кнопок - PullRequest
0 голосов
/ 27 февраля 2019

Цель: При наборе одной кнопки все цвета кнопок сбрасываются на цвет по умолчанию, а нажатая кнопка меняет цвет.(поэтому будет только одна кнопка с другим цветом)

setup .py file

class Profiles(Screen):
    def __init__(self, **kwargs):
        super(Profiles, self).__init__(**kwargs)
        Clock.schedule_once(self.create_profs, -1)

    def create_profs(self, *args):

        #create buttons and screens for each item in acc_abr
        for i in acc_abr:

            #AccountOne inherits from kivy's Screen class. Store new screen into a screen manager named "am"
            self.ids["am"].add_widget(AccountOne(name=i))

            #AccButt inherits from kivy's Button class
            self.ids["acc_butt_box"].add_widget(AccButt(text=i, id=i, on_press=partial(self.switching_function, i)))

    #change current screen 
    def switching_function(self, screename, *args):
        self.ids["am"].current = screename

Кнопки создаются в цикле for, и им присваивается идентификатор на основе элементов вacc_abr

Надо поработать с содержимым AccButt, которое выглядит следующим образом:

class AccButt(Button):
    def __init__(self, **kwargs):
        super(Button,self).__init__(**kwargs)

        self.bind(on_press = self.change_butt_color)

    def change_butt_color(self, *args):
        self.background_color = 0,0,0,0

Прежде всего, у меня есть доступ ко всем идентификаторам кнопок с момента егоидентификаторы основаны на списке acc_abr.

Итак, моей первой идеей было создание цикла for, который изменил цвет всех кнопок по умолчанию, прежде чем изменить цвет своих собственных.что выглядит следующим образом:

def change_butt_color(self, *args):
    for butts in acc_abr:
        self.parent.ids[butts].background_color = 1,1,1,1
    self.background_color = 0,0,0,0

Проблема в том, что я получаю ключевую ошибку для всего, что находится в butts.Таким образом, у меня проблема со связью с кнопками.

Возможно, я неправильно понимаю, где находятся другие кнопки, или я неправильно назначил идентификатор кнопкам (AccButt)или время мешает.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

РЕШЕНИЕ

Путь, в котором находятся элементы с кнопками, - self.parent.children.С помощью этой информации вы можете изменить background_color всех кнопок.

ПРИМЕР

def change_butt_color(self, *args):
    for child in self.parent.children:
        child.background_color = 1,1,1,1
    self.background_color = 0,0,0,0

обратите внимание, что ids не ищет кнопки.Вместо этого self.parent.children используется для поиска родителей родителей кнопки, то есть самого себя и братьев и сестер (self).

0 голосов
/ 27 февраля 2019

Решение

Использование on_touch_down, сброс background_color и проверка на collide_point

Событие касания виджета »on_touch_down

on_touch_down (касание)

Получение события касания.

Параметры:
касание: MotionEvent класс

Сенсорный получен.Касание в родительских координатах.См. lativelayout для обсуждения систем координат.

Возвращает: bool Если True, отправка события касания остановится.Если значение False, событие будет по-прежнему отправляться на остальную часть дерева виджетов.

Управление вводом »Основные сведения о событиях касания

По умолчанию сенсорные события отправляются всем отображаемым в данный момент виджетам.Это означает, что виджеты получают событие касания, независимо от того, происходит ли оно в пределах их физической области.

...

Чтобы обеспечить максимальную гибкость, Kivy отправляет события всем виджетам и позволяетони решают, как реагировать на них.Если вы хотите отвечать только на события касания внутри виджета, вы просто проверяете:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
        # The touch has occurred inside the widgets area. Do stuff!
        pass

Пузырьки событий касания виджета

Когда вы перехватываете сенсорные события между несколькими виджетами, вам часто нужно знать порядок, в котором эти события распространяются.В Киви события всплывают от первого ребенка вверх через других детей.Если у виджета есть дочерние элементы, событие передается через его дочерние элементы, а затем передается в виджет после него.

Пример

main.py

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.button import Button
from kivy.lang import Builder


class CreateButton(Button):

    def on_touch_down(self, touch):
        if set(self.background_color) & set([0, 0, 0, 0]) == {0}:
            self.background_color = [1, 1, 1, 1]    # default texture is grey

        if self.collide_point(*touch.pos):
            self.background_color = [0, 0, 0, 0]    # black color


class OnTouchDownDemo(GridLayout):

    def __init__(self, **kwargs):
        super(OnTouchDownDemo, self).__init__(**kwargs)
        self.build_board()

    def build_board(self):
        # make 9 buttons in a grid
        for i in range(0, 9):
            button = CreateButton(id=str(i))
            self.add_widget(button)


Builder.load_file('main1.kv')


class OnTouchDownApp(App):

    def build(self):
        return OnTouchDownDemo()


if __name__ == "__main__":
    OnTouchDownApp().run()

main.kv

#:kivy 1.11.0

<CreateButton>:
    font_size: 50

<OnTouchDownDemo>:
    rows: 3
    cols: 3
    row_force_default: True
    row_default_height: 150
    col_force_default: True
    col_default_width: 150
    padding: [10]
    spacing: [10]

Выход

Kivy on_touch_down & collide_point

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