> 技术文档 > OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的远程控制软件设计方案_fastapi 与 tkinter结合

OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的远程控制软件设计方案_fastapi 与 tkinter结合

以下是基于 OpenCV + PyAutoGUI + Tkinter + FastAPI + Requests 实现的远程控制软件设计方案。该方案分为 被控端(服务端)控制端(客户端),支持屏幕实时查看、键盘映射和鼠标操作。


1. 系统架构

+-------------------+ +-------------------+ +-------------------+| 控制端(Tkinter) || 网络通信(HTTP) || 被控端(FastAPI) || UI界面 | | FastAPI + Requests | | OpenCV + PyAutoGUI |+-------------------+ +-------------------+ +-------------------+

2. 被控端(服务端)

功能
  • 提供屏幕截图接口
  • 接收键盘和鼠标操作指令
依赖安装
pip install fastapi pyautogui opencv-python uvicorn
代码实现
# server.pyfrom fastapi import FastAPI, HTTPExceptionimport pyautoguiimport cv2import numpy as npimport base64from fastapi.responses import JSONResponsefrom fastapi.middleware.cors import CORSMiddlewareapp = FastAPI()# 允许跨域app.add_middleware( CORSMiddleware, allow_origins=[\"*\"], allow_methods=[\"*\"], allow_headers=[\"*\"],)# 屏幕截图接口@app.get(\"/screenshot\")def get_screenshot(): try: # 使用pyautogui截图 screenshot = pyautogui.screenshot() # 转换为OpenCV格式(BGR) frame = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR) # 压缩图像 _, buffer = cv2.imencode(\".jpg\", frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70]) # 转换为Base64编码 jpg_as_text = base64.b64encode(buffer).decode() return JSONResponse(content={\"image\": jpg_as_text}) except Exception as e: raise HTTPException(status_code=500, detail=str(e))# 键盘操作接口@app.post(\"/keyboard\")def keyboard_action(key: str): try: pyautogui.press(key) return {\"status\": \"success\", \"key\": key} except Exception as e: raise HTTPException(status_code=500, detail=str(e))# 鼠标操作接口@app.post(\"/mouse\")def mouse_action(x: int = None, y: int = None, button: str = \"left\", clicks: int = 1): try: if x is not None and y is not None: pyautogui.moveTo(x, y) pyautogui.click(button=button, clicks=clicks) return {\"status\": \"success\", \"action\": f\"Mouse {button} clicked at ({x}, {y})\"} except Exception as e: raise HTTPException(status_code=500, detail=str(e))if __name__ == \"__main__\": import uvicorn uvicorn.run(app, host=\"0.0.0.0\", port=8000)
启动服务
python server.py

3. 控制端(客户端)

功能
  • 显示实时屏幕画面
  • 提供键盘和鼠标操作界面
依赖安装
pip install requests tkinter
代码实现
# client.pyimport tkinter as tkimport requestsfrom PIL import Image, ImageTkimport base64from io import BytesIOclass RemoteControlClient: def __init__(self, root, server_ip=\"127.0.0.1\"): self.root = root self.server_ip = server_ip self.root.title(\"远程控制客户端\") self.root.geometry(\"800x600\") # 图像显示区域 self.panel = tk.Label(root) self.panel.pack() # 键盘输入框 self.key_entry = tk.Entry(root, width=20) self.key_entry.pack(pady=10) self.key_entry.bind(\"\", self.send_keyboard) # 鼠标坐标输入 self.x_entry = tk.Entry(root, width=5) self.y_entry = tk.Entry(root, width=5) self.x_entry.pack(side=tk.LEFT, padx=10) self.y_entry.pack(side=tk.LEFT, padx=10) # 鼠标点击按钮 self.mouse_btn = tk.Button(root, text=\"点击\", command=self.send_mouse) self.mouse_btn.pack(side=tk.LEFT, padx=10) # 定时刷新屏幕 self.update_screen() def update_screen(self): try: # 获取截图 response = requests.get(f\"http://{self.server_ip}:8000/screenshot\") data = response.json() # 解码Base64图像 image_data = base64.b64decode(data[\"image\"]) image = Image.open(BytesIO(image_data)) # 调整图像尺寸 image = image.resize((800, 600), Image.ANTIALIAS) photo = ImageTk.PhotoImage(image) self.panel.configure(image=photo) self.panel.image = photo except Exception as e: print(\"屏幕更新失败:\", e) # 每100毫秒刷新一次 self.root.after(100, self.update_screen) def send_keyboard(self, event=None): key = self.key_entry.get() requests.post(f\"http://{self.server_ip}:8000/keyboard\", params={\"key\": key}) self.key_entry.delete(0, tk.END) def send_mouse(self): x = int(self.x_entry.get()) y = int(self.y_entry.get()) requests.post(f\"http://{self.server_ip}:8000/mouse\", params={\"x\": x, \"y\": y})if __name__ == \"__main__\": root = tk.Tk() app = RemoteControlClient(root, server_ip=\"192.168.1.100\") # 替换为被控端IP root.mainloop()

4. 使用说明

部署步骤
  1. 被控端

    • 运行 server.py,确保与控制端处于同一局域网。
    • 记录被控端的局域网IP(如 192.168.1.100)。
  2. 控制端

    • 修改 client.py 中的 server_ip 为被控端IP。
    • 运行 client.py,打开Tkinter界面。
功能演示
  • 屏幕查看:Tkinter窗口实时显示被控端屏幕。
  • 键盘输入:在输入框中输入按键(如 aenter),按回车发送。
  • 鼠标操作:输入坐标并点击“点击”按钮,触发鼠标点击。

5. 扩展功能建议

  1. 多分辨率适配:动态调整屏幕缩放比例。
  2. 加密传输:使用HTTPS和API密钥增强安全性。
  3. 实时视频流:改用WebSocket替代HTTP轮询,降低延迟。
  4. 文件传输:添加文件上传/下载接口。
  5. 多平台支持:通过PyInstaller打包为exe或macOS应用。

6. 注意事项

  • 性能优化:降低截图分辨率和帧率以减少带宽占用。
  • 防火墙设置:确保被控端开放 8000 端口。
  • 异常处理:增加网络断开重连机制。
  • 权限问题:被控端需保持屏幕常亮且未锁定。

通过以上方案,你可以快速实现一个基础的远程控制工具。如果需要更高级的功能(如实时音视频传输、多点协作),可结合 WebRTCZeroMQ 进一步扩展。