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

时间:2017-02-13 03:14:03

标签: python-3.x mqtt raspberry-pi3

我试图制作一个小型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")

现在有人知道如何使用变量&#34; masterangel&#34;在while循环中? 顺便说一下,打印顺序很好。

  print ( masterangel ) 

提前感谢您,感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您需要在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")

答案 1 :(得分:-1)

为了避免以后变量范围可能出现的问题(即将局部变量与全局变量混合),而不是使用#include <iostream> #include <math.h> #include <cstdlib> int main() { long N,NN = 0; double h, tau, T1, T2 = 0; N=100; NN=pow(N,3); h=1/N; tau=pow(1/N,3); T1=1; T2=1.5; double T [N][NN]; for (int i=0; i<N; i++) { T [i][0]=T1; for (int j=0; j<NN; j++) { T [0][j]=T1; T [N][j]=T2;}} for (int i=1; i<N-1; i++) { for (int j=1; j<NN; j++) { T [i][j]=T [i][j-1]+(tau/(pow(h,2)))*(T [i+1][j-1]+T [i-1][j-1]-2*T [i][j-1]);}} return 0; } 关键字,请利用return语句。

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

global