Изменение цвета кнопки при каждом нажатии кнопки - PullRequest
0 голосов
/ 03 октября 2019

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

kv file:

<Type>:
    name: "type"
        RoundedButton:
            size_hint: 0.417, 0.15625
            pos_hint: {"x": 0.0556, "y": 0.15}
            on_press: root.change_color()
            Image:
                source: 'Job.PNG'
                size: self.parent.width, .85 * self.parent.height
                pos: self.parent.x, self.parent.y + 5
                stretch: True
                keep_ratio: False

<RoundedButton@Button>:
    background_normal: ""
    background_color: 0, 0, 0, 0
    back_color: 0.2,0.6,1,1
    border_radius: 10
    color: self.back_color
    bold: True
    canvas.before:
        Color:
            rgba: self.back_color
        Line:
            rounded_rectangle: self.x, self.y, self.width, self.height, self.border_radius
            width: 

Python-файл:

class Type(Screen):
    back_color = ObjectProperty()
    def change_color(self):
        if self.back_color == (0.2,0.6,1,1):
            self.back_color = (0, 1, 0, 1)
        else:
            self.back_color = (0.2,0.6,1,1)

Я думал, что логика, которая была у меня в py-файле, проверит, является ли цвет синим (0.2,0.6,1,1), то есть не нажат, он станет зелеными если бы он не был синим (поэтому должен быть зеленым, он бы стал синим. Однако, когда я нажимаю кнопку, ничего не происходит, нет ошибки, она просто не становится зеленой.

1 Ответ

0 голосов
/ 03 октября 2019

Пара проблем.

Сначала ваш метод change_color() пытается изменить back_color в вашем Type экземпляре, но ваше правило RoundedButton ссылается на back_color в вашем RoundedButton экземпляр (не тот, что в Type). Поэтому любые изменения, которые вносит метод, не влияют на RoundedButton.

Во-вторых, оператор if:

if self.back_color == (0.2,0.6,1,1):

никогда не будет истинным. Частично из-за первой проблемы, но и сравнение должно быть:

if self.back_color == [0.2,0.6,1,1]:

Я не уверен, почему это так.

Я думаю, что самый простой способ решить первую проблему - эточтобы добавить id к RoundedButton:

<Type>:
    name: "type"
    RoundedButton:
        id: butt
        size_hint: 0.417, 0.15625
        pos_hint: {"x": 0.0556, "y": 0.15}
        on_press: root.change_color()

Затем измените метод change_color() на:

class Type(Screen):
    def change_color(self):
        if self.ids.butt.back_color == [0.2,0.6,1,1]:
            self.ids.butt.back_color = (0, 1, 0, 1)
        else:
            self.ids.butt.back_color = (0.2,0.6,1,1)

Обратите внимание, что back_color ObjectProperty неНеобходимый.

Если вы хотите, чтобы RoundedButtons независимо менял цвет, вы можете определить RoundedButton как:

class RoundedButton(Button):
    back_color = ListProperty()

    def change_color(self):
        if self.back_color == [0.2,0.6,1,1]:
            self.back_color = [0, 1, 0, 1]
        else:
            self.back_color = [0.2,0.6,1,1]

И в своем файле kv:

<Type>:
    name: "type"
    RoundedButton:
        size_hint: 0.417, 0.15625
        pos_hint: {"x": 0.0556, "y": 0.15}
        Image:
            source: 'Job.PNG'
            size: self.parent.width, .85 * self.parent.height
            pos: self.parent.x, self.parent.y + 5
            stretch: True
            keep_ratio: False
    RoundedButton:
        size_hint: 0.417, 0.15625
        pos_hint: {"right": 1, "top": 1}
        Image:
            source: 'Job.PNG'
            size: self.parent.width, .85 * self.parent.height
            pos: self.parent.x, self.parent.y + 5
            stretch: True
            keep_ratio: False

<RoundedButton>:
    background_normal: ""
    background_color: 0, 0, 0, 0
    back_color: 0.2,0.6,1,1
    border_radius: 10
    color: self.back_color
    bold: True
    on_press: self.change_color()
    canvas.before:
        Color:
            rgba: self.back_color
        Line:
            rounded_rectangle: self.x, self.y, self.width, self.height, self.border_radius
...