kivy 将文本输入绑定到滑块值

kivy bind textiput to slider vlaue

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

这是我第一次尝试通过 id。它有效,但如果我更改滑块值,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()

您应该能够将它们相互绑定:

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