【问题标题】:How to get on_press to work in custom buttons?如何让 on_press 在自定义按钮中工作?
【发布时间】:2017-07-18 23:53:46
【问题描述】:

我正在尝试创建一个自定义按钮,该按钮在按下时会改变颜色(实际上是改变图像上的色调),我什至无法让 on_press 正常工作。应用程序运行,但按下按钮会出现错误:“属性错误:'ImageButton' 对象没有属性'change_color'”

python 文件:

import kivy
kivy.require("1.10.0")
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.lang.builder import Builder

class Container(BoxLayout):
    pass

class ImageButton():
    def change_color(self):
        print("Success!")

class TestName(App):
    def build(self):
        return tester

tester = Builder.load_file("test.kv")

if __name__ == '__main__':
    TestName().run()

Kivy 文件:

Container:

<Container>:
    BoxLayout:
        ImageButton:
            source: "emptybox.png"


<ImageButton@Button>:
    source: None
    on_press: root.change_color()

    Image:
        source: root.source
        pos: root.pos
        size: root.size

【问题讨论】:

  • 你想改变ImageButton的背景颜色还是文字颜色?
  • 我将在按钮按下时在按钮上创建一个透明画布,使其看起来更暗。
  • 我刚刚创建了一个答案,在这种情况下,我使用透明图像更改了背景。但是,如果您有问题,请发表评论,我会编辑答案。

标签: python python-3.x kivy kivy-language


【解决方案1】:

我在您的代码中发现了两个问题:

  • 首先,build方法返回testerBuilder.load_file的输出)。

  • 另一方面,.py 文件中的 ImageButton 类应该继承自 kivy.uix.button.Button

我不知道你想改变什么“颜色”,我给你举个例子,当你按下时改变背景颜色:

import kivy
kivy.require("1.10.0")

from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.lang.builder import Builder
from random import random


kv_text = '''
<Container>:
    BoxLayout:
        ImageButton:
            source: "emptybox.png"


<ImageButton@Button>:
    source: None
    on_press: self.change_color()

    Image:
        source: root.source
        pos: root.pos
        size: root.size

'''


class Container(BoxLayout):
    pass

class ImageButton(Button):
    def change_color(self):
        self.background_color = (random(), random(), random(),  1)

class TestName(App):
    def build(self):
        Builder.load_string(kv_text)
        return Container()

if __name__ == '__main__':
    TestName().run()

输出:

【讨论】:

  • 我知道我错过了一些简单的东西,我忘了从 Button 继承!太感谢了!我喜欢你的榜样。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 2022-11-29
相关资源
最近更新 更多