从根类外部更改按钮颜色

Posted

技术标签:

【中文标题】从根类外部更改按钮颜色【英文标题】:Changing button color from outside of root class 【发布时间】:2019-07-31 07:23:01 【问题描述】:

我是 kivy 的新手,我遇到了我自己找不到解决方案的问题。基本上我想在每次按 F4 时更改按钮的颜色。 这是我在主循环中的代码:

if win32api.GetAsyncKeyState(F4) or F4s == True:
        F4sw = not F4sw
        if F4sw == True:
            ApexDash().recoilon()
        else:
            ApexDash().recoiloff()

这是我在 F4sw 为 True 时引用的方法:

class ApexDash(Screen,FloatLayout):

def recoilon(self):
    global F4s
    F4s = True

    print('check')

    self.ids.recoil_on.color = (1,0,0,1)
    self.ids.recoil_off.color = (0,1,0,1)

所以这里的问题是,每当我按 F4 时,打印检查都会按预期进行,但按钮不会改变颜色。但是,每当我从 .kv 文件调用函数时,它们确实会改变颜色。

Button:
        id: recoil_on
        background_normal: ''
        text: 'ON'
        on_press: root.recoilon()
        color: 0,1,0,1
        size_hint: 0.1, 0.1
        pos_hint: "x":0.03, "top":0.65

但是当从类外部执行该方法时,所有小部件属性似乎都不起作用。抱歉,如果我遗漏了一些明显的东西,我们将不胜感激。

【问题讨论】:

【参考方案1】:

调用ApexDash() 会创建ApexDash 的新实例,因此每次调用ApexDash().recoilon() 时都会创建一个不会在任何地方显示的新布局(您必须调用add_widget 才能将其放置在某处),更改它的小部件,然后默默地丢弃它。您应该存储对实际可见小部件的引用以对其进行操作,例如:

if win32api.GetAsyncKeyState(F4) or F4s == True:
        F4sw = not F4sw
        if F4sw == True:
            self.apex_dash.recoilon()
        else:
            self.apex_dash.recoiloff()

if win32api.GetAsyncKeyState(F4) or F4s == True:
        F4sw = not F4sw
        if F4sw == True:
            self.ids.apex_dash.recoilon()
        else:
            self.ids.apex_dash.recoiloff()

我认为您不应该在框架之外使用win32api 的调用,Kivy 可以自己捕获键盘事件(请参阅here)。

也尽量避免在 python 代码中使用global。根小部件级别属性可能是更好的选择。

【讨论】:

以上是关于从根类外部更改按钮颜色的主要内容,如果未能解决你的问题,请参考以下文章

Javascript通过将鼠标悬停在按钮外部来更改按钮的颜色

通过打字稿更改按钮单击时的svg颜色

通过外部管理员或服务器更改移动网站背景颜色

如何更改按钮的边框颜色并更改editText中下划线的颜色?

月出颜色主题的日食:更改按钮颜色

如何更改主题更改时浮动操作按钮的颜色?