我是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}
但是当从类外部执行该方法时,所有小部件属性似乎都不起作用。对不起,如果我错过了明显的东西,任何帮助表示赞赏
调用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
。根小部件级别属性可能是更好的选择。