#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