当我在另一个小部件中单击鼠标时,我正在尝试使用新文本重置文本输入框,我不太确定如何实现这一点。我曾尝试在很多方面改变代码,但显然不是我在做什么。以下是我正在使用的代码:感谢恶意和极限让我这么做
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()
感谢您的帮助
答案 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的引用,或者一些类似的简单解决方案。