从根类外部更改按钮颜色

2024-09-29 17:14:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来基维的,我遇到了我自己找不到解决办法的问题。基本上我想改变颜色的按钮,每次我按下F4。 这是我在主循环中的代码:

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

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

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}

但是当从类外执行该方法时,所有小部件属性似乎都不起作用。对不起,如果我错过了一些明显的东西,任何帮助都将不胜感激


Tags: 方法selftrueidsif颜色on按钮
1条回答
网友
1楼 · 发布于 2024-09-29 17:14:44

调用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。根小部件级别的属性可能是更好的选择

相关问题 更多 >

    热门问题