在画布上动态更新标签

问题描述 投票:0回答:1

我正在尝试更新画布上的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(触摸式)完美工作

python label kivy
1个回答
0
投票

您的代码有一些问题:

  • colorLabel属性需要四个值的列表,每个值的范围为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,该类正在LabelCanvas_w的顶部绘制。

解决了上述问题后,我相信您的代码将按预期工作。

如果您调用self.canvas.clear(),则似乎label_textCanvas_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将正确显示。

© www.soinside.com 2019 - 2024. All rights reserved.