Kivy GUI - 在水中填充颜色,像水一样填充圆形容器,用于两个或更多水箱

时间:2018-03-19 06:56:27

标签: python python-2.7 kivy

from kivy.app import App
from kivy.clock import Clock
from kivy.uix.widget import Widget
from kivy.uix.anchorlayout import AnchorLayout
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

Builder.load_string("""
<WaterFill>:
    id: c_canvas
    level: 0.0
    width: self.height    
    size_hint: None, 1 
    color: 0, 0, 1
    canvas:
        StencilPush
        Ellipse:
            group: 'a'            
            size: (200, 200)
            pos: 150,270             

        StencilUse
        Color:
            rgb: root.color
        Rectangle:
            group: 'a'
            pos: root.pos
            size: (root.width, root.level*root.height)
        StencilUnUse
        StencilPop

        Ellipse:
            group: 'b'
            size: (200, 200)            
            pos: 450,270 

    Button:
        text: 'Try me!'
        on_release: root.press_me()          
""")


class WaterFill(Widget):
    def __init__(self, *args, **kwargs):
        Widget.__init__(self, *args, **kwargs)
        self.delta = 0.01

        Clock.schedule_interval(self.on_timeout, 0.05)

    def on_timeout(self, *args):        
        #self.root.ids.c_canvas.canvas.get_group('a').level += self.delta  #i tried by id and by group  but unabel to find solution
        self.level += self.delta
        if self.level >= 1:
            #self.delta = -0.01
            self.delta = -1.1
        elif self.level <= 0:
            self.delta = 0.01

    def press_me(self):
        print("pressed")  # on press need to fill circle


class TestApp(App):
    def build(self):
        #lay = AnchorLayout(anchor_x='center', anchor_y='center')
        #lay.add_widget(WaterFill())
        return WaterFill()

if __name__ == "__main__":
    TestApp().run()

我如何使用Kivy GUI - fill color in circle like water fill in circle container level wise相同的逻辑更改2个或更多圆填充布局。我尝试通过定义id但无法以任何方式这样做???请帮助如何使用2个或更多圈子的帆布设计!!!

1 个答案:

答案 0 :(得分:0)

如果你想处理它,每个人都应该轻易地独立考虑绘图,这就是我在之前的答案中提出的。

在下面的示例中,我们使用布局来定位它并使用id来访问值。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout

root = Builder.load_string(""" 
<WaterFill@Widget>:
    level: 0
    color: 0, 0, 1
    canvas:
        StencilPush
        Ellipse:
            pos: root.pos
            size: root.size
        StencilUse
        Color:
            rgb: root.color
        Rectangle:
            pos: root.pos
            size: (root.width, root.level*root.height)
        StencilUnUse
        StencilPop  

<FloatLayout>:
    WaterFill:
        id: left
        level: 0.4
        pos_hint:  {'x' : 0.10, 'y': 0.4}
        size_hint: 0.4, 0.4
    WaterFill:
        id: right
        pos_hint:  {'x' : 0.55, 'y': 0.4}
        size_hint: 0.4, 0.4
    Button:
        id: button
        text: 'text'
        size_hint: .25, .25
        on_press: root.press_me()
""")

class Principal(FloatLayout):
    def press_me(self):
        current_level = self.ids["right"].level
        self.ids["right"].level = 0.0 if current_level >= 1.0 else current_level + 1.0/9

class TestApp(App):
    def build(self):
        return Principal()

if __name__ == "__main__":
    TestApp().run()

注意:

我建议阅读关于kivy语言,.kv的设计如何与.py链接