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