如何从 Def 中的变量获取数据以在外部使用它并保持更新?

how to get data from a variable in Def to use it outside and remains updated?

我正在尝试制作一个小型的 3 连接机器人。它们必须相互发送和接收传感器数据,并采取行动使读数再次趋于零。 我试着交换动作的角度,让对方跟着自己。我正在使用 MQTT,它运行良好。 但是当我尝试从 def on_message 获取数据以在下一个变量不是全局变量时使用它。 代码如下:

 ############### MQTT section ##################

# when connecting to mqtt do this;
def on_connect(client, userdata, flags, rc):
 print("Connected with result code "+str(rc))
 client.subscribe(sub_topic)

# when receiving a mqtt message do this;

def on_message(client, userdata, msg):
 masterangel = int(msg.payload)
 print ( masterangel )



client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, 1883, 60)
client.loop_start()

# Start the Program
psm.screen.termPrintAt(1, "Press Go to stop program")

while(not doExit):

 oldAngel = Angel

 Angel = gyro.readValue()

 Angelshow = "Current Angel ="+"  "+str (Angel)

 if ( oldAngel != Angel):
   psm.screen.termPrintAt(5, Angelshow)





 if (Angel < masterangel) :
  psm.BBM1.setSpeedSync(20)
  psm.BAM1.floatSync()

 elif (masterangel < Angel ) :
  psm.BAM1.setSpeedSync(20)
  psm.BBM1.floatSync()

  client.publish(pub_topic, "test")

现在有人知道如何在 while 循环中使用变量 "masterangel" 吗? 顺便说一句,打印顺序很好。

  print ( masterangel ) 

提前致谢,感谢您的帮助

您需要在 onMessage 函数范围之外初始化变量,然后在 onMessage 函数中将其标记为全局变量。

看看 python global 关键字。

 ############### MQTT section ##################

# when connecting to mqtt do this;
def on_connect(client, userdata, flags, rc):
 print("Connected with result code "+str(rc))
 client.subscribe(sub_topic)

# when receiving a mqtt message do this;

def on_message(client, userdata, msg):
 # use global version not local
 global masterangel
 masterangel = int(msg.payload)
 print ( masterangel )



client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, 1883, 60)
client.loop_start()

# initialise variable to starting value
masterangel = 0

# Start the Program
psm.screen.termPrintAt(1, "Press Go to stop program")

while(not doExit):

 oldAngel = Angel

 Angel = gyro.readValue()

 Angelshow = "Current Angel ="+"  "+str (Angel)

 if ( oldAngel != Angel):
   psm.screen.termPrintAt(5, Angelshow)





 if (Angel < masterangel) :
  psm.BBM1.setSpeedSync(20)
  psm.BAM1.floatSync()

 elif (masterangel < Angel ) :
  psm.BAM1.setSpeedSync(20)
  psm.BBM1.floatSync()

  client.publish(pub_topic, "test")

为了避免以后变量范围可能带来的问题(即混合局部变量和全局变量),不要使用 global 关键字,而是利用 return 语句。

换句话说,return 允许您实际使用传递给 return 函数的参数并将其存储到另一个变量中,而 print() 只是打印到屏幕上。

############### MQTT section ##################

# when connecting to mqtt do this;
def on_connect(client, userdata, flags, rc):
 print("Connected with result code "+str(rc))
 client.subscribe(sub_topic)

# when receiving a mqtt message do this;

def on_message(client, userdata, msg):
 masterangel = int(msg.payload)
 return (masterangel) # Use return() instead of print ()



client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(Broker, 1883, 60)
client.loop_start()

# Start the Program
psm.screen.termPrintAt(1, "Press Go to stop program")


#Assign the value of masterangel being returned by calling the on_message
#function and storing it into its own variable.

new_var = on_message() # This stores the returned value of masterangel


while(not doExit):

 oldAngel = Angel

 Angel = gyro.readValue()

 Angelshow = "Current Angel ="+"  "+str (Angel)

 if ( oldAngel != Angel):
   psm.screen.termPrintAt(5, Angelshow)





 if (Angel < new_var) :
  psm.BBM1.setSpeedSync(20)
  psm.BAM1.floatSync()

 elif (new_var < Angel ) :
  psm.BAM1.setSpeedSync(20)
  psm.BBM1.floatSync()

  client.publish(pub_topic, "test")