如何在不使用while循环的情况下运行ros发布程序?在python中?

时间:2018-11-26 23:13:21

标签: python tkinter freeze ros

我正在编写用于打开和关闭发布者的tkinter python程序。我需要使用按钮打开和关闭发布者。如果使用while循环编写,则整个gui都会冻结,我将无法进行任何操作。请给我一些建议。

dummy = Button(master, text="dummy", relief='groove',command=self.pub_values)
def pub_values(self):
    self.pub = rospy.Publisher('/gateway/RigPLC2Seq', Int32MultiArray, queue_size=10)
    rospy.init_node('talker_int', anonymous=True)
    rate = rospy.Rate(1)  # 10hz
    self.var = Int32MultiArray()
    self.var.data = []
    ls = self.extract_values()
    self.var.data = ls
    self.on = True
    while self.on == True:
        rospy.loginfo(self.var)
        self.pub.publish(self.var)
        rate.sleep()

2 个答案:

答案 0 :(得分:0)

您的解决方案并不遥不可及。

  1. 您将self.on设置为True,然后有一个while loop会检查为self.on的值,如果True应该冻结({{1 }})您的GUI。

您的代码遵循您输入的内容。

解决方案:

您必须在.sleep()中具有将while loop的值更改为self.on的条件,如果不这样做,while循环将永远不会停止执行。示例:

False

使用上面的代码,我希望循环运行10次,之后counter=1 self.on = True while self.on == True: rospy.loginfo(self.var) self.pub.publish(self.var) rate.sleep() if counter==10: self.on=False counter++ 变成self.on并且False退出,这也解冻了GUI(while loop不再运行)

  1. 更重要的是上面的@ j_4321建议,.sleep()会冻结GUI,只要它正在运行,就可以使用.sleep()方法为您提供更好的服务。 如果您想使用.after()方法,This应该可以帮助您了解。{li>

答案 1 :(得分:0)

您可以使用after替换while循环。 self.on为真时,publish被执行和重新安排。当self.on设置为true时,按钮命令切换publish并重新启动self.on

import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)

        self.on = False

        self.button = tk.Button(self, text='Start', command=self.start_stop)
        self.button.pack()

    def start_stop(self):
        if self.on:
            self.button.configure(text='Start')
            self.on = False  # stop publish
        else:
            self.button.configure(text='Stop')
            self.on = True
            self.publish()  # relaunch publish

    def publish(self):
        if self.on:
            print('publish')
            self.after(1000, self.publish)

App().mainloop()