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。我试过这个,但它没有打印任何值(我在尝试控制任何东西之前用基本的东西测试它的方法)所有注释掉的部分都是来自原始测试的代码位,用于检查服务器端的东西。所有这些都工作正常。

4

1 回答 1

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')

尽管经过反思,但仍不清楚为什么您希望在独立函数中使用它。您或许应该让 MotorControl 成为 MyTCPHandler 上的一个方法,然后它就已经可以访问self.

于 2013-08-23T12:49:33.173 回答