2016-05-11 8 views
3

Ich wollte den Text meines Etiketts entsprechend der Nachricht ändern, die mein Knoten abonniert hat. Das Problem besteht jedoch darin, dass sich der Text im Etikett bei der Änderung der Themenmeldung nicht ändert. Ein Teil meines Codes ist unten angegeben: (Ich habe den Code dynamisch den Text auf dem Etikett ändern von https://bytes.com/topic/python/answers/629499-dynamically-displaying-time-using-tkinter-label)Wie ändern wir dynamisch den Text im Etiketten-Widget von Tkinter gemäß der Änderung der abonnierten Thema Nachricht?

v = StringVar() 
v.set(distance) 
self.clock = Label(frame, font=('times', 20, 'bold'), bg='green', textvariable = v) 
self.clock.pack(fill=BOTH, expand=1) 
rate = rospy.Rate(2) 

while not rospy.is_shutdown(): 
    rospy.Subscriber("distance", Float32, self.callback) 
    v.set(distance) 
    print("distance = %f", distance) 
    frame.update_idletasks() 
    rate.sleep() 
+1

ich nicht die 'distance' Variable überall aktualisiert sehen Sie werden. Gibt Ihr 'print' die richtige Nachricht aus? –

+0

Entfernungsvariable wird innerhalb der Rückruffunktion des Teilnehmers aktualisiert. – Telepresence

Antwort

1

Nun, Ihr Code (oder zumindest der Teil Sie auf dem Laufenden) scheint ein unordentlich zu sein ein.

ROS sprechen,

  • define your subscriber in the initialization of the node (nicht innerhalb die while-Schleife, die stattdessen mehrere Teilnehmer schaffen!)
  • create a callback to get the messages unter diesem Thema ausgetauscht lesen Sie die Nachricht
  • update your label entsprechend.

That being said, hier ist ein Beispiel dafür, wie der Code aussehen sollte: (Lückenfüller)

#!/usr/bin/env python 
import rospy 
from std_msgs.msg import Float32 

def callback(data): 
    distance = data.data 
    rospy.loginfo(rospy.get_caller_id() + "distance = ", distance) 
    #here update your label, I assume the following (maybe not correct) 
    v = StringVar() 
    v.set(distance) 
    self.clock = Label(frame, font=('times', 20, 'bold'), bg='green', textvariable = v) 
    self.clock.pack(fill=BOTH, expand=1) 

def listener(): 
    rospy.init_node('listener', anonymous=True) 
    rospy.Subscriber("distance", Float32, self.callback) 
    # spin() simply keeps python from exiting until this node is stopped 
    rospy.spin() 


if __name__ == '__main__': 
    listener()