2013-08-23 93 views
0

我想激活一個函數,一旦完成,就會更改某些電機的控制變量。這些命令通過套接字服務器通過wifi進入。這是代碼;從另一個類別中的另一個函數激活一個函數

import SocketServer 
import Tkinter as Tk 
from Tkinter import * 

class MyTCPHandler(SocketServer.BaseRequestHandler): 
     def handle(self): 
      self.DriveSend = self.request.recv(1024).strip() 
      self.SteeringSend = self.request.recv(1024).strip() 
      #print("{} wrote:".format(self.client_address[0])) 
      #print(self.DriveSend) 
      #print(self.SteeringSend) 
      #self.request.sendall(self.DriveSend.upper()) 
      #self.request.sendall(self.SteeringSend.upper()) 
      return (self.DriveSend,self.SteeringSend) 
      MotorControl() 

def MotorControl(): 
     MotorVar = MyTCPHandler() 
     MotorVar.handle() 
     MotorVar.DriveSend 
     MotorVar.SteeringSend 
     print(MotorVar.DriveSend) 
     print(MotorVar.SteeringSend) 
     print('test') 

if __name__ == "__main__": 
     HOST, PORT = "192.168.2.12", 9999 
     server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler) 
     server.serve_forever() 

正如你可以看到服務器持續運行,並期待傳入的消息,我想這是每收到一個新的消息,最好從我的客戶端程序運行時的功能MotorControl。我試過這個,但它沒有打印任何值(我的方式是在我嘗試和控制任何東西之前用一些基本的東西來測試它)所有註釋掉的部分都是從原始測試代碼中檢查服務器端的東西。所有這些工作都很好。

回答

0

這裏有幾個錯誤。首先,MyTCPHandler方法在調用函數之前返回。當函數中的返回被命中時,執行立即返回並且該函數中的更多代碼將不會被執行。

其次,你已經有了MyTCPHandler方法來調用MotorControl函數,但是這個函數實例化了一個類的新實例,它自然沒有任何信息集。相反,你應該將你的實例傳遞給函數。

所以:

class MyTCPHandler(SocketServer.BaseRequestHandler): 
     def handle(self): 
      self.DriveSend = self.request.recv(1024).strip() 
      self.SteeringSend = self.request.recv(1024).strip() 
      MotorControl(self) 
      return (self.DriveSend,self.SteeringSend) 

def MotorControl(motor_var): 
     print(motor_var.DriveSend) 
     print(motor_var.SteeringSend) 
     print('test') 

雖然反射,它爲什麼你要這樣在一個獨立的功能反正目前尚不清楚。您應該在MyTCPHandler上創建一個MotorControl方法,然後它將有權訪問self

+0

非常感謝!一直在掙扎着。關於想要獨立的功能,這是由於我未來的目標,包括試圖建立自主控制的選項:P(雄心勃勃的我的編程水平,我知道),並將簡單地使用電機控制功能來控制電機從無論什麼時候輸入都是有效的。所以我想要它分開 –