我正在尝试更新画布上的Label,但是只有当我从MyApp(APP)调用update()方法时,它才会更改。
并且有趣的是,方法obj Slider(触摸式)完美工作
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.core.window import Window
from kivy.uix.label import Label
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics import (Color, Ellipse)
from kivy.uix.slider import Slider
import random
from functools import partial
class Canvas_w(Widget):
def __init__(self, **kwargs):
self.i = 0
super(Canvas_w, self).__init__(**kwargs)
self.label_text =Label(text= "0",color = (255,0,0))
def update_text(self, text):
self.label_text.text = text
def on_touch_down(self, touch):
with self.canvas:
d=30
self.i+=1
Color(1., 0, 0)
Ellipse(pos=(touch.x - d/2, touch.y - d/2), size=(20,20))
self.label_text=str(self.i)
class Label_l(GridLayout):
bones = 0
def __init__(self, **kwargs):
super(Label_l, self).__init__(**kwargs)
self.label_text =Label(text= "0")
self.add_widget(self.label_text)
#self.label_text.text=self.C.i
def update_text(self, text):
Label_l.bones=text
self.label_text.text = str(Label_l().bones)#
Label_l.text=str(Label_l().bones)
class WidgetContainer(GridLayout):
sld_value = 0.00001
def __init__(self, **kwargs):
super(WidgetContainer, self).__init__(**kwargs)
self.cols = 1
self.speedControl = Slider(min=0.00001, max=3, step=0.0001)
self.add_widget(Label(text="Speed Iteration"))
self.add_widget(self.speedControl)
self.add_widget(Label(text=''))
self.speedValue = Label(text="0.00001")
self.add_widget(self.speedValue)
self.speedControl.bind(value=self.on_value)
def on_value(self, instance, speed):
self.sld_value = speed
WidgetContainer.sld_value = self.sld_value
self.speedValue.text = str(round(speed,5))
class MyApp(App):
def build(self):
b3 = BoxLayout(orientation="horizontal")
b1 = FloatLayout()
self.painter = Canvas_w()
self.label_l= Label_l()
b1.add_widget(self.label_l)
b1.add_widget(self.painter)
b1.add_widget(WidgetContainer())
b3.add_widget(b1)
return(b3)
if __name__=="__main__":
MyApp().run()
我正在尝试更新画布上的Label,但是只有当我从MyApp(APP)调用update()方法时,它才会更改。
并且有趣的是,方法obj Slider(触摸式)完美工作
您的代码有一些问题:
color
的Label
属性需要四个值的列表,每个值的范围为0到1。在self.label_text =Label(text= "0",color = (255,0,0))
类中将self.label_text =Label(text= "0",color = (1,0,0,1))
更改为Canvas_w
。Label
从未被绘制。您需要将self.add_widget(self.label_text)
添加到__init__()
的Canvas_w
方法中。Label
类中有另一个Label_l
,该类正在Label
中Canvas_w
的顶部绘制。解决了上述问题后,我相信您的代码将按预期工作。
如果您调用self.canvas.clear()
,则似乎label_text
的Canvas_w
子级已被删除。实际上,它并没有被删除,但是只是不可见(可能被覆盖)。使它可见的一种方法是,只需将其删除就可以确保最后绘制,然后重新添加(最后添加的子项最后绘制),如下所示:
self.canvas.clear()
self.remove_widget(self.label_text)
self.add_widget(self.label_text)
[经过更多研究后,我相信canvas.clear()
正在从Label
中删除Canvas
的图形。但是,您可以使用:
canvas.before
上绘制图形with self.canvas.before:
在on_touch_down()
方法中。而不是使用:
self.canvas.clear()
用途:
self.canvas.before.clear()
我相信完成上述操作后,您的Label
将正确显示。