Kivy在小部件之间发送文本

时间:2013-10-26 22:37:48

标签: text input widget kivy

当我在另一个小部件中单击鼠标时,我正在尝试使用新文本重置文本输入框,我不太确定如何实现这一点。我曾尝试在很多方面改变代码,但显然不是我在做什么。以下是我正在使用的代码:感谢恶意和极限让我这么做

Builder.load_string('''
    <MouseWidget>:
    image: image
    label: label
    orientation: 'vertical'
    Image:
        id: image
        source: root.source

    Label:
        id: label
        size_hint_y: None
        height: 50
        text: 'Hello World'
''')

class Test(TextInput):


    def on_double_tap(self):
        # make sure it performs it's original function
        super(Test, self).on_double_tap()

        def on_word_selection(*l):
            selected_word = self.selection_text
            print selected_word

        # let the word be selected wait for
        # next frame and get the selected word
        Clock.schedule_once(on_word_selection)

class MouseWidget(BoxLayout): 
    image = ObjectProperty()
    label = ObjectProperty()
    source = StringProperty()

在此def中,我想更新在AccordianAPP中创建的textinput框,并在每次在图像上单击鼠标时通过TEST发送新文本

    def on_touch_down(self, touch):

        if self.image.collide_point(*touch.pos):
            self.label.text = str(touch.pos)

    def on_touch_up(self, touch):
        self.label.text = 'Hello World'

class AccordianApp(App):
    def build(self):
    root = Accordion(orientation='horizontal')

    item= AccordionItem(title='Page One')
    src = "image.png"
    image = MouseWidget(source=src, size_hint = (1.0, 1.0))

这是我想在单击图像时将text =“”重置为其他内容的textinput

    textinput = Test(text='Testing', size_hint = (0.5, 1.0))

    # add image to AccordionItem
    item.add_widget(image)
    item.add_widget(textinput)
    root.add_widget(item)

    return root

if __name__ == '__main__':
    AccordianApp().run()

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

这里你真正需要的是一个引用到mousewidget可以访问的textinput。只要mousewidget可以访问分配给textinput的某个变量,它就可以对该textinput执行任何喜欢的操作。

这是一个简单的修改,只是将一个属性'self.textinput'添加到mousewidget,然后设置为指向textinput。然后在on_touch_up方法中,可以很容易地将文本添加到textinput ...在这种情况下,每次都附加新坐标。

from kivy.lang import Builder
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.accordion import *
from kivy.properties import *
from kivy.app import App

Builder.load_string('''
<MouseWidget>:
    image: image
    label: label
    orientation: 'vertical'
    Image:
        id: image
        source: root.source

    Label:
        id: label
        size_hint_y: None
        height: 50
        text: 'Hello World'
''')

class Test(TextInput):


    def on_double_tap(self):
        # make sure it performs it's original function
        super(Test, self).on_double_tap()

        def on_word_selection(*l):
            selected_word = self.selection_text
            print selected_word

        # let the word be selected wait for
        # next frame and get the selected word
        Clock.schedule_once(on_word_selection)

class MouseWidget(BoxLayout): 
    image = ObjectProperty()
    label = ObjectProperty()
    source = StringProperty()
    textinput = ObjectProperty()

    def on_touch_down(self, touch):

        if self.image.collide_point(*touch.pos):
            self.label.text = str(touch.pos)

    def on_touch_up(self, touch):
        self.label.text = 'Hello World'
        if self.textinput is not None:
            self.textinput.text += ' ... and {}'.format(touch.pos)

class AccordianApp(App):
    def build(self):
        root = Accordion(orientation='horizontal')

        item= AccordionItem(title='Page One')
        src = "image.png"
        image = MouseWidget(source=src, size_hint = (1.0, 1.0))

        textinput = Test(text='Testing', size_hint = (0.5, 1.0))
        image.textinput = textinput

        # add image to AccordionItem
        item.add_widget(image)
        item.add_widget(textinput)
        root.add_widget(item)

        return root

if __name__ == '__main__':
    AccordianApp().run()

这不是唯一的方法 - 有很多方法可以让这个参考可用,不同的方法可能在不同情况下有用。例如,您可以创建另一个包含mousewidget和textinput的小部件,并用kv语言编写所有绑定。

另一个对不相关的小部件有用的技巧(在它们之间传递引用并不容易)是将引用存储在App类中。你可以做点什么

class AccordianApp(App):
    some_thing = ObjectProperty()
    ...

这很有用,因为您始终可以使用App.get_running_app()访问该应用,因此即使您有断开连接的小部件而无法查看它们的通信方式,您也可以将文本输入存储在应用级别,以便轻松获取任何内容在它。

我希望这很明确......我只是想说,有几种可能性可能适合不同的情况。对于您的特定问题,您可以在mousewidget中存储对textinput的引用,或者一些类似的简单解决方案。