Final Vision Get Picture Pos Send 2 Python Control Robot

import tkinter as tk
from tkinter import messagebox, filedialog
from tkinter import ttk
import socket
import threading
import subprocess
from datetime import datetime
from PIL import Image, ImageTk
import time

# 全局变量
client_socket = None
connected = False
robot_ip = "192.168.1.100"  # 假定的机器人IP地址
robot_port = 7930  # 假定的机器人端口

def connect_to_server():
    global client_socket, connected
    ip = "127.0.0.1"
    port = 7930
    
    try:
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.connect((ip, port))
        connected = True
        update_status_indicator('green', f"Connected to server at {ip}:{port}")
        log_event(f"Connected to server at {ip}:{port}")
        
        # Start a new thread to receive data
        threading.Thread(target=receive_data).start()
    except Exception as e:
        connected = False
        update_status_indicator('red', f"Failed to connect to server: {e}")
        log_event(f"Failed to connect to server: {e}")

def disconnect_from_server():
    global client_socket, connected
    if connected:
        client_socket.close()
        connected = False
        update_status_indicator('red', "Disconnected from server")
        log_event("Disconnected from server")

def receive_data():
    while connected:
        try:
            data = client_socket.recv(1024).decode('utf-8')
            if not data:
                break
            current_time = datetime.now().strftime("%H:%M:%S")
            received_data_text.insert(tk.END, f"[{current_time}] {data}\n")
            received_data_text.yview_moveto(1)  # Scroll to the bottom
            log_event(f"Received data: {data}")
        except Exception as e:
            print(f"Error receiving data: {e}")
            log_event(f"Error receiving data: {e}")
            break
    disconnect_from_server()

def launch_application():
    app_path = r"D:\aa\Public_Release\aa.exe"
    try:
        subprocess.Popen(app_path)
        log_event("Launched application successfully.")
    except Exception as e:
        messagebox.showerror("Error", f"Failed to launch application: {e}")
        log_event(f"Failed to launch application: {e}")

def log_event(event):
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_text.insert(tk.END, f"[{current_time}] {event}\n")
    log_text.yview_moveto(1)  # Scroll to the bottom

def update_status_indicator(color, message):
    status_indicator.config(bg=color)
    root.update_idletasks()  # Ensure UI updates immediately
    messagebox.showinfo("Status", message)

def send_robot_command(command):
    if connected and client_socket:
        try:
            client_socket.sendall(command.encode('utf-8'))
            log_event(f"Sent command to Robot: {command}")
        except Exception as e:
            log_event(f"Failed to send command to Robot: {e}")

def connect_to_robot():
    global client_socket, connected
    try:
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        client_socket.settimeout(3)  # 设置超时时间为3秒
        client_socket.connect((robot_ip, robot_port))
        connected = True
        update_status_indicator('green', f"Connected to Robot at {robot_ip}:{robot_port}")
        log_event(f"Connected to Robot at {robot_ip}:{robot_port}")
        # Start a new thread to receive data
        threading.Thread(target=receive_data).start()
    except socket.timeout:
        connected = False
        update_status_indicator('red', "Connection timed out.")
        log_event("Connection timed out.")
        if client_socket:
            client_socket.close()
    except Exception as e:
        connected = False
        update_status_indicator('red', f"Failed to connect to Robot: {e}")
        log_event(f"Failed to connect to Robot: {e}")
        if client_socket:
            client_socket.close()

def send_custom_command():
    command = custom_command_entry.get()
    if command:
        send_robot_command(command)
        custom_command_entry.delete(0, tk.END)  # Clear the entry box after sending
        log_event(f"Custom command entered: {command}")

# 创建主窗口
root = tk.Tk()
root.title("TCP Client")
root.geometry("800x600")

# 设置网格权重以确保区域可以正确扩展
root.grid_columnconfigure(0, weight=1)
root.grid_columnconfigure(1, weight=2)
root.grid_columnconfigure(2, weight=1)
root.grid_rowconfigure(0, weight=1)  # 上半部分
root.grid_rowconfigure(1, weight=1)  # 下半部分

# 上半部分 - 已有内容
left_frame = tk.Frame(root, width=250, height=300)
left_frame.grid(row=0, column=0, padx=5, pady=5, sticky="nsew")

main_label = tk.Label(left_frame, text="Main", font=("Helvetica", 14))
main_label.pack(pady=(10, 5))

image_path = r"C:\Users\Administrator\Desktop\Study\i.png"  # 替换为实际图像路径
try:
    image = Image.open(image_path)
    image = image.resize((150, 150), Image.Resampling.LANCZOS)
    img = ImageTk.PhotoImage(image)
except IOError:
    img = None

launch_button = tk.Button(left_frame, image=img, command=launch_application)
if img:
    launch_button.image = img  # Keep a reference!
launch_button.pack(pady=10)

start_label = tk.Label(left_frame, text="Start 2 Visions", font=("Helvetica", 12))
start_label.pack()

middle_frame = tk.Frame(root, width=300, height=300)
middle_frame.grid(row=0, column=1, padx=5, pady=5, sticky="nsew")

control_and_label_frame = tk.Frame(middle_frame)
control_and_label_frame.pack(anchor='center', pady=(10, 0), expand=True)

received_data_label = tk.Label(control_and_label_frame, text="Receive", font=("Helvetica", 14))
received_data_label.pack(side=tk.TOP, anchor='center')

button_width = int(8 * 0.9)
button_height = int(2 * 0.9)

connect_button = tk.Button(control_and_label_frame, text="Connect", command=connect_to_server, width=button_width, height=button_height)
connect_button.pack(side=tk.LEFT, anchor='center', padx=5)

disconnect_button = tk.Button(control_and_label_frame, text="Disconnect", command=disconnect_from_server, width=button_width, height=button_height)
disconnect_button.pack(side=tk.LEFT, anchor='center', padx=5)

spacer_label = tk.Label(control_and_label_frame, text="   ")
spacer_label.pack(side=tk.LEFT, anchor='center')

status_indicator = tk.Frame(control_and_label_frame, width=int(20*0.2), height=int(20*0.2), bg='red')
status_indicator.pack(side=tk.LEFT, anchor='center', padx=(0, 5))

received_data_text = tk.Text(middle_frame, wrap=tk.WORD, height=15, width=40)
received_data_text.pack(padx=10, pady=10)

right_frame = tk.Frame(root, width=200, height=300)
right_frame.grid(row=0, column=2, padx=5, pady=5, sticky="nsew")

log_label = tk.Label(right_frame, text="Log", font=("Helvetica", 14))
log_label.pack(pady=(10, 5))

log_text = tk.Text(right_frame, wrap=tk.WORD, height=15, width=30)
log_text.pack(padx=10, pady=10)

# 下半部分 - Robot 控制区域
bottom_frame = tk.Frame(root, bg='lightgray')
bottom_frame.grid(row=1, column=0, columnspan=3, padx=5, pady=5, sticky="nsew")


# 添加 "Connect 2 Robot" 按钮
connect_robot_button = tk.Button(bottom_frame, text="Connect 2 Robot", command=connect_to_robot)
connect_robot_button.pack(side=tk.TOP, pady=(10, 5))

# U+ 和 U- 按钮所在的框架
control_buttons_frame = tk.Frame(bottom_frame)
control_buttons_frame.pack(side=tk.TOP, pady=10)

u_plus_button = tk.Button(control_buttons_frame, text="U+", command=lambda: send_robot_command("MOV P222"))
u_minus_button = tk.Button(control_buttons_frame, text="U-", command=lambda: print("U- Pressed"))

u_plus_button.pack(side=tk.LEFT, padx=5)
u_minus_button.pack(side=tk.LEFT, padx=5)

# 发送自定义命令的区域
custom_command_frame = tk.Frame(bottom_frame)
custom_command_frame.pack(side=tk.TOP, pady=10, fill=tk.X, expand=True)

custom_command_label = tk.Label(custom_command_frame, text="Enter Command:", font=("Helvetica", 14))
custom_command_label.pack(side=tk.LEFT, padx=5)

custom_command_entry = tk.Entry(custom_command_frame, font=("Helvetica", 20), fg="purple")
custom_command_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=5)

send_command_button = tk.Button(custom_command_frame, text="Send", command=send_custom_command, font=("Helvetica", 14))
send_command_button.pack(side=tk.LEFT, padx=5)

# 初始化全局变量
client_socket = None
connected = False

# 运行主循环
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35979.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Spring框架-IoC的使用(基于XML和注解两种方式)

一、Spring IoC使用-基于XML 1 IoC使用-基于XML 使用SpringIoC组件创建并管理对象 1.1 创建实体类 package com.feng.ioc.bean;import java.util.Date;/*** program: spring-ioc-demo1* description: 学生实体类* author: FF* create: 2024-12-04 18:53**/ public class Stud…

C++编程控制舵机的实现与应用

在嵌入式编程和物联网应用中,舵机是一种非常重要的执行器,广泛应用于机器人、遥控玩具、机械臂、摄像头云台等多个领域。舵机不仅能够精准地控制角度位置,还能在一定的工作范围内持续保持该位置。在本篇文章中,我们将站在 C 编程教…

对于MySQL中视图的相关实验

以下用该表举例: /*Table structure for table employees */ DROP TABLE IF EXISTS employees; CREATE TABLE employees ( employee_id int(6) NOT NULL DEFAULT 0, first_name varchar(20) DEFAULT NULL, last_name varchar(25) NOT NULL, email varc…

day-90 使数组为空的最少操作次数

思路 统计每个数字出现的次数,计算每个数字的操作次数,将所有操作次数累加返回即可 解题过程 对于每个数字(假设出现次数num),如果num等于1,返回-1;如果num%3等于0,返回num/3;如果num%3不等于0…

6.xftp使用教程

xftp用于windows和linux之间进行文件互传 1.先安装xftp软件,并双击打开 2.文件 – 新建 3.配置参数 4.连接 5.把需要的文件扯到右边

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

前言 nmap网络连接端扫描软件,用于主机发现、端口扫描、版本侦测、操作系统侦测 namp 链接:https://pan.quark.cn/s/4ea55a2d62c3 提取码:aXnr 下载压缩包后解压 !!安装路径不要有中文 链接失效(可能被官…

详解组合模式

引言 有一种情况,当一组对象具有“整体—部分”关系时,如果我们处理其中一个对象或对象组合(区别对待),就可能会出现牵一发而动全身的情况,造成代码复杂。这个时候,组合模式就是一种可以用一致的…

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…

SQL语法——DQL查询

1.查询: 基础查询: select 列名1,列名2 from 表名; # 输入列名为*时为全查 条件查询: select 列名 from 表名 where 条件; #条件中含字符串时为字符串

Manus手套动作捕捉AI训练灵巧手

随着人工智能(AI)和机器人技术的融合日益紧密,使用真实动作数据AI扩容训练机器人的方式正在被用于开发更富表现力的机器人。Manus手套凭借精准的动作捕捉技术和导出数据的强大兼容性,在灵巧手的研发和应用中发挥了重要作用。 手部…

Altium Designer学习笔记 29 PCB布线_信号线

基于Altium Designer 23学习版,四层板智能小车PCB 更多AD学习笔记:Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

【02】复用松散型栅格切片

栅格切片分三种类型: 松散型、紧凑型v1紧凑型v2 见链接:https://blog.csdn.net/gislaozhang/article/details/144296963 说明:Linux环境或者Windows环境都可以参考类似的思路复用 前提条件:将旧服务切片服务缓存文件拷贝到新机器…

dd破坏asm磁盘头恢复---惜分飞

有朋友对asm disk的磁盘头dd了2048byte的数据 通过分析,gi软件版本,确认是11.2.0.4 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Real Application Clusters and Automatic Storage Management options. ORACLE_HOME /u01/app/…

【多线程-第一天-NSThread-互斥锁和自旋锁的区别-练习-异步下载网络图片 Objective-C语言】

一、互斥锁和自旋锁的区别 1.刚刚我们看过了,互斥锁和自旋锁,下边我们来看,互斥锁和自旋锁的一个区别, 1)互斥锁:如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其他线程时间片到了,打开锁后,线程会被唤醒(执行) 它是被唤醒的,相当于什么呢,…

【vue3 for beginner】Pinia基本用法:存储user的信息

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库,是 Vuex 的…

PS的功能学习(钢笔+...)

钢笔工具 转换点工具,就是按住alt就可以转换了,也不用特意去工具列表里找着点 弯度钢笔工具也是比较鸡肋的,钢笔工具熟练之后,控制的也会更精确,弯度虽然简化了,但是也增加了曲线的弯度限制 其他的功能&a…

论著和教材的区别是什么?

1、内容性质 论著: 内容以作者的研究成果和学术观点为主。它是作者在某一学科领域进行深入研究后,通过实验、调查、理论推导等方式得出的创新性见解。例如,在生物学论著中,作者可能通过长期的野外观察和基因分析,提出…

java环境配置

后端JAVA软件的记录下载 纯粹自己懒,有个记录后面换电脑换公司方便 1、java的下载 oracle.com 更详细的可以看这个 JDK1.8下载、安装和环境配置教程_jdk1.8下载与安装教程_KristenX的博客-CSDN博客 2、java中变量的定义 数据类型 名称 值 /java中8中数据变量 …

03、Node.js安装及环境配置

1.下载node.js 下载地址:Node.js 2.安装 2.1 自定义安装路径(可以选择默认) 下图根据本身的需要进行,我选择了默认Node.js runtime,然后Next: Node.js runtime :表示运行环境 npm package mana…

如何突破TikTok播放量零瓶颈

TikTok已成为全球最受欢迎的短视频平台之一,吸引了数亿用户。然而,许多新手创作者在上传视频后常常面临播放量为零的困境。这种情况让人感到困惑,尤其是在精心制作视频内容后,却没有得到预期的曝光和互动。那么,为什么…