Kivy在小部件之间发送文本

英语毕业

当我在另一个小部件中单击鼠标时,我试图用新文本重置文本输入框,但我不太确定如何实现此操作。我已经尝试过以多种方式更改代码,但是显然不是我在做什么。这是我正在使用的代码:感谢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()

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

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

这是textinput,当我单击图像时,我想将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()

谢谢您的帮助

激进的

您真正需要的是对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(),因此,即使您已断开小部件的连接并且看不到它们之间的通信方式,也可以将文本输入存储在应用程序级别,以便任何东西都能轻松获得。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python中Kivy小部件之间的交互

来自分类Dev

Kivy更新小部件

来自分类Dev

Kivy删除小部件

来自分类Dev

更改Kivy小部件的文本部分的颜色

来自分类Dev

如何在Kivy中添加滚动文本小部件?

来自分类Dev

更改Kivy小部件的文本部分的颜色

来自分类Dev

在 Python 和 Kivy 语言之间实例化 Kivy Children 小部件

来自分类Dev

文本小部件tkinter

来自分类Dev

在kivy中添加小部件

来自分类Dev

在kivy中添加小部件

来自分类Dev

循环创建 Kivy 小部件

来自分类Dev

如何在行小部件中两个文本小部件之间的文本小部件中添加省略号

来自分类Dev

如何将 tkinter 的文本小部件的文本发送或打印到打印机?

来自分类Dev

如何在Kivy中自动更新小部件上的文本?

来自分类Dev

Kivy 用另一个小部件的文本填充画布对象

来自分类Dev

解决小部件之间的顺序

来自分类Dev

Tkinter只读文本小部件

来自分类Dev

获取按钮小部件的文本

来自分类Dev

标记文本小部件-Tkinter

来自分类Dev

Flutter:垂直文本小部件

来自分类Dev

Tkinter只读文本小部件

来自分类Dev

Qt:文本中的小部件

来自分类Dev

标记文本小部件-Tkinter

来自分类Dev

如何立即更新Kivy中的小部件?

来自分类Dev

透明支持kivy modalview小部件的中心

来自分类Dev

如何在Kivy中重置小部件

来自分类Dev

在kivy文件中导入小部件

来自分类Dev

Kivy在布局的末尾添加小部件

来自分类Dev

将小部件放在Kivy的顶部