0

当我在另一个小部件中单击鼠标时,我试图用新文本重置文本输入框,但我不太确定如何做到这一点。我尝试过以多种方式更改代码,但显然不是我在做什么。这是我正在使用的代码:感谢 inclement 和 qua-non 让我走到这一步

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()

正是在这个定义中,我想更新在 AccordianAPP 中创建并通过 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 = 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()

谢谢您的帮助

4

1 回答 1

1

您真正需要的是对 mousewidget 可以访问的文本输入的引用。只要 mousewidget 可以访问分配给 textinput 的某个变量,它就可以对该 textinput 执行任何它喜欢的操作。

这是一个简单的修改,只是将属性“self.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 的引用,或一些类似的简单解决方案。

于 2013-10-26T23:36:56.967 回答