在Kivy GUI中使用ROS消息和Python更新文本输入框

0 投票
2 回答
1125 浏览
提问于 2025-04-18 11:00

我正在设计一个图形用户界面(GUI),目的是通过ROS、kivy和Python来控制步进电机。下面是这个GUI的一个简化版本。实际上,我想用一个ROS消息来更新kivy中的一个文本输入框(只读)。在这个简化的例子中,按下按钮应该把第一个输入框的数据通过一个本地的ROS节点传输到第二个输入框。不过,看起来在rospy.Subscriber()中的回调函数并没有进入Test类。

谢谢大家的建议!

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

2 个回答

0

我找到了解决办法:

我需要给按钮添加一个释放事件。

on_release: 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

撰写回答