我正在编写用于打开和关闭发布者的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()
答案 0 :(得分:0)
您的解决方案并不遥不可及。
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
不再运行)
.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()