2015-09-27 75 views
0

我想创建一个控制面板,它提供了一个快速输入滑块,但也是一个textinput作为浮点数输入精确值。另外应该有一个标签,显示实际值。 问题是,我不退出如何将所有三个小部件相互链接,并自动更新它们,如果更改值... 一切都在外部.kv文件中完成。kivy绑定textiput滑块vlaue

这是我第一次尝试通过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() 
+0

你能发布一个完整的可运行的例子? – bj0

+0

抱歉,延迟。我在第一篇文章中添加了一个完整的示例。 – wurstsalat

回答

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 
+0

非常感谢,帮助了很多。我知道一定有通过属性的解决方案,但不知道如何正确使用它们。还有很多要为我学习,但这使我前进。谢谢。 – wurstsalat