更改多个按钮的颜色

时间:2019-02-27 04:01:25

标签: python-3.x kivy

目标:在一组按钮中,当按下一个按钮时,所有按钮的颜色都会重置为其默认颜色,而按下的按钮会更改颜色。 (因此只有一个具有不同颜色的按钮)

设置.py文件

model.save()

按钮是在for循环中创建的,并根据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

中的项目给出一个ID。

我需要处理的是acc_abr的内容,如下所示:

AccButt

首先,我可以访问所有按钮的id名称,因为其id基于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 列表。

所以我的第一个想法是创建一个for循环,将所有按钮的颜色更改为默认值,然后再更改其自身的颜色。看起来像这样:

acc_abr

问题是,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正确分配一个ID,或者时间搞砸了。不知道,

请赐福我您的见识。谢谢

2 个答案:

答案 0 :(得分:0)

解决方案

使用on_touch_down,重置background_color,然后检查collide_point

Widget Touch Event » on_touch_down

  

on_touch_down(触摸)

     

接收降落事件。

     

参数:
   touch: MotionEvent

     

已收到触摸。触摸位于父坐标中。看到   relativelayout讨论坐标系。

     

返回: bool如果为True,则触摸事件的发送将停止。如果为False,则事件将继续分派给其他人   小部件树的形状。

Input Management » Touch event basics

  

默认情况下,触摸事件将分派给所有当前显示的事件   小部件。这意味着小部件会接收触摸事件,无论它是否发生   不在他们的物理区域内。

     

...

     

为了提供最大的灵活性,Kivy派遣了   所有小部件的事件,并让他们决定如何对它们做出反应。   如果您只想响应小部件内的触摸事件,则可以   只需检查:

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

Widget touch event bubbling

  

当您在多个小部件之间捕获触摸事件时,通常需要   了解这些事件的传播顺序。在   奇异果,事件从第一个孩子到另一个孩子   孩子们。如果小部件有子级,则事件将通过其   子,然后再传递给小部件。

示例

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

答案 1 :(得分:0)

解决方案

包含按钮同级的路径为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)。