如何在Kivy Python中通过按钮动态更改画笔颜色?
解决Kivy按钮点击切换画笔颜色的问题
嘿,我看了你这段代码,已经离实现目标很近了!按钮事件能正常触发,但画笔颜色没跟着变的原因,是你在newclr里调用on_touch_move的方式不对——而且这个方法根本不需要手动调用,它是Kivy自动触发的触摸事件回调。咱们来修正一下:
问题出在哪?
你的newclr函数已经成功把全局变量pencolor改成了按钮的背景色,但后面那句self.on_touch_move完全是无效操作:
on_touch_move是Kivy内置的触摸移动处理方法,只有当用户拖动手指/鼠标时才会自动触发- 你调用它的时候没传必要的
color和touch参数,这行代码啥也干不了
修正后的完整代码示例
触摸绘制方法调整
首先把on_touch_move的参数简化一下(既然用了全局pencolor,就不用传color参数了),还要注意Kivy的Color需要RGBA四元组,得解包传递:
def on_touch_move(self, touch): # 先判断是不是有效的触摸事件,避免误触发 if touch.is_touch: with self.pc.canvas: global wtd, pencolor, penrad # 解包pencolor的RGBA值传给Color Color(*pencolor) if wtd == 1: Ellipse(pos=(touch.x, touch.y), size=(penrad, penrad))
按钮点击事件简化
newclr只需要更新pencolor就行,不用管on_touch_move——下一次用户拖动触摸时,Kivy会自动调用它,那时就会用新的颜色绘制了:
def newclr(self, instance): global pencolor # Kivy按钮的background_color是RGBA格式的四元组,直接赋值 pencolor = instance.background_color return pencolor
为啥这样就生效了?
当你点击按钮时,pencolor已经被更新为按钮的背景色。之后用户拖动手指/鼠标绘图,on_touch_move会自动触发,此时Color(*pencolor)就会使用新的颜色值,画笔颜色自然就变成按钮的背景色啦~
额外小建议
尽量少用全局变量哦!可以把wtd、pencolor、penrad改成类的实例属性(比如self.wtd、self.pencolor),这样代码更清晰,也符合面向对象的编程习惯。初始化的时候给pencolor设个默认值,比如self.pencolor = (1, 0, 0, 1)(红色),体验会更好。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

