kivy将textiput绑定到滑块vlaue

时间:2015-09-27 18:00:51

标签: slider bind kivy textinput

我想创建一个控制面板,它提供一个用于快速输入的滑块,还有一个textinput,用于输入精确值作为浮点数。此外,还应有一个标签,显示实际值。 问题是,我不会放弃如何将所有三个小部件相互链接并在更改值时自动更新它们... 一切都在外部.kv文件中完成。

这是我第一次尝试通过身份证。它工作但如果我更改滑块值,textinput不会更改其内容。有没有人能为我的问题找到更好的解决方案? 谢谢你的帮助:)

这是test.kv的内容:

<MainLayout>:
BoxLayout:
    pos: self.parent.x + self.parent.width*0.1, self.parent.y
    orientation: 'vertical'
    BoxLayout:
        orientation: 'horizontal'
        Label:
            color: 0, 0, 0, 1
            font_size: 20 
            text: 'Position: ' + str(linear_pos_slider.value) + ' mm' 
            size: self.texture_size  
        Slider:
            id: linear_pos_slider
            orientation: 'horizontal'
            max: 50
            min: -50
            padding: 1
            value: float(linear_pos_ti.text)
            step: 0.1
        TextInput:
            id: linear_pos_ti
            size_hint: 0.2, 0.8
            font_size: 20
            text_color: 0, 0, 0, 1
            input_filter: 'float'
            multiline: 'False'
            text: '0'

以下是使应用程序运行的test.py的内容:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.slider import Slider
from kivy.uix.floatlayout import FloatLayout

from kivy.core.window import Window

Window.clearcolor = (1, 1, 1, 1)


class MainLayout(BoxLayout):
    pass


class Test(App):

    def build(self):
        return MainLayout()


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

1 个答案:

答案 0 :(得分:0)

你应该能够将它们彼此绑定:

Label:
    color: 0, 0, 0, 1
    font_size: 20
    text: 'Position: ' + str(linear_pos_slider.value) + ' mm'
    size: self.texture_size
Slider:
    id: linear_pos_slider
    orientation: 'horizontal'
    max: 50
    min: -50
    padding: 1
    value: float(linear_pos_ti.text)
    step: 0.1
TextInput:
    id: linear_pos_ti
    size_hint: 0.2, 0.8
    font_size: 20
    text_color: 0, 0, 0, 1
    input_filter: 'float'
    multiline: 'False'
    text: str(linear_pos_slider.value)

虽然在实践中,如果在代码中使用NumericProperty(或StringProperty)并将它们绑定到该代码会更好。这具有所有相同的优点,但它更清晰,并且您也可以从代码端轻松访问。

请注意,由于绑定是单向的(属性 - >小部件),因此您需要使用on_*个事件进行设置:

Slider:
    id: linear_pos_slider
    orientation: 'horizontal'
    max: 50
    min: -50
    padding: 1
    value: root.value
    on_value: root.value = self.value
    step: 0.1
TextInput:
    id: linear_pos_ti
    size_hint: 0.2, 0.8
    font_size: 20
    text_color: 0, 0, 0, 1
    input_filter: 'float'
    multiline: 'False'
    text: str(root.value)
    on_text: root.value = float(self.text)

使用:

from kivy.properties import NumericProperty, StringProperty

class MainLayout(BoxLayout):
    value = NumericProperty(0.0)
    pass