从另一个类中的另一个函数激活一个函数

时间:2013-08-23 12:40:37

标签: python class main function

我正在尝试激活一个功能,一旦完成,将更改某些电机的控制变量。命令通过套接字服务器通过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功能。我尝试了这个,但它没有打印任何值(我在尝试控制任何东西之前用基本的东西测试它的方式)所有注释掉的部分都是来自原始测试的一些代码来检查服务器端的东西。所有这些都很好。

1 个答案:

答案 0 :(得分:0)

这里有一些问题。首先,MyTCPHandler方法在调用函数之前返回。当命中函数中的返回时,执行立即返回,并且不再执行该函数中的代码。

其次,您已经调用了MotorControl函数的MyTCPHandler方法,但是该函数实例化了该类的新实例,该实例自然没有任何信息集。相反,您应该将您的实例传递给函数。

所以:

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