从根类外部更改按钮颜色

时间:2019-03-09 12:01:23

标签: python kivy kivy-language

我是新手,但是遇到了无法为自己找到解决方案的问题。基本上,我想每次按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 个答案:

答案 0 :(得分:0)

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

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() 的调用,Kivy可以捕获键盘事件本身(请参见here)。

也请尝试避免在python代码中使用win32api。根窗口部件级别的属性可能是一个更好的选择。