Использование сообщения ROS и python для обновления поля ввода текста в графическом интерфейсе kivy

#python #user-interface #message #kivy #ros

#python #пользовательский интерфейс #Сообщение #kivy #ros

Вопрос:

Я пытаюсь разработать графический интерфейс для работы с шаговыми двигателями с помощью ROS, kivy и python. Вы можете найти минимальную версию графического интерфейса ниже. На самом деле я хочу использовать сообщение ROS для обновления поля ввода текста kivy (только для чтения). В минимальном примере нажатие кнопки должно перенести данные из первого поля ввода через локальный узел ROS во второе поле ввода. На самом деле кажется, что обратный вызов в rospy.Subscriber() не входит в тестовый класс.

Спасибо за любые предложения!

main.py

 import kivy
kivy.require('1.7.2')

import rospy
from std_msgs.msg import String

from kivy.app import App
from kivy.core.window import Window
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout

class Test(BoxLayout):
    text_is = 'text before button press'

    def Pub(self):
        publish = self.ids.test_text_pub.text
        try:
            ROSNode.new_text_is.publish(publish)
        except rospy.ROSInterruptException: pass

class ROSNode(Widget):

    def Callback(publish):
        print(publish.data) #check if Callback has been called
        test.text_is = publish.data

    new_text_is = rospy.Publisher('new_text_is', String, queue_size=10)
    rospy.Subscriber('new_text_is', String, Callback)

    rospy.init_node('talker', anonymous=True)

class TestApp(App):

    def build(self):
        return Test()

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

test.kv

 #:kivy 1.0

<Test>:
    BoxLayout:
        orientation: 'vertical'

        Button:
            id: test_button
            text: 'publish'
            on_press: root.Pub()

        TextInput:
            id: test_text_pub
            text: 'text after button press'

        TextInput:
            id: test_text_sub
            text: root.text_is
  

Ответ №1:

Если вы хотите, чтобы ваш текст обновлялся автоматически, вам необходимо использовать свойства Kivy.

 from kivy.properties import StringProperty
class Test(BoxLayout):
    text_is = StringProperty('text before button press')
  

Свойства Kivy поддерживают привязку данных, поэтому любые обновления свойства будут распространяться на любой связанный виджет. Привязка происходит автоматически в kv, поэтому, когда вы делаете это:

 text: root.text_is
  

..вы говорите Kivy, что при root.text_is обновлении обновите и мой text .

Комментарии:

1. Это не решило проблему. Я предполагаю, что это что-то с обратным вызовом subcriber.

Ответ №2:

Итак, я нашел решение:

Мне пришлось добавить событие on_release к кнопке.

 on_release: test_text_sub.text = root.text_is