AGV系统控制位置管理功能

2023-11-11 18:04

本文主要是介绍AGV系统控制位置管理功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# ファイル: agv_locattion.py
# 説明: AGV (Automated Guided Vehicle) の位置情報を管理し、UDPサーバーとして動作するGUIアプリケーションです。

# 必要なライブラリをインポート
import tkinter as tk
import socket
import threading

def AGV_handle_submit(canvas, start_photo, x_entry, y_entry, submit_button):
    """UDPサーバーアプリケーションのGUIを作成します。

    Args:
        canvas:tk.Canvas,
        start_photo (ImageTk.PhotoImage):
        x_entry (tk.Entry):
        y_entry (tk.Entry):
        submit_button (tk.Button): 
    """
    
    
    # 以下の関数内で使う変数を初期化
    HOST = '127.0.0.1'  # ホストIPアドレス
    PORT = 8080  # ポート番号
    server_socket = None  # グローバル変数としてサーバーソケットを定義

    def start_server():
        """UDPサーバーの待機とメッセージの受信を行います。"""
        nonlocal server_socket  # ローカル変数ではなく外側の変数を参照するためのnonlocal宣言

        # ソケットを作成し、ホストとポートにバインド
        server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        server_socket.bind((HOST, PORT))

        update_message_label("サーバーを開始しました。")

        while True:
            # データを受信する
            try:
                data, client_address = server_socket.recvfrom(1024)
            except OSError as e:
                print("ソケットの受信エラー:", e)
                break
            data = data.decode()
            update_message_label(f"クライアントからのメッセージ: {data}")

            # ドロップダウンメニューにデータを追加
            add_data_to_drop_menu(data)

            # クライアントにメッセージを送信する
            message = "サーバーからのメッセージ: データが送信できました!"
            server_socket.sendto(message.encode(), client_address)

    def start_server_thread():
        """サーバースレッドを開始します。"""
        threading.Thread(target=start_server).start()

    def close_connection():
        """サーバーソケットを閉じます。"""
        nonlocal server_socket
        if server_socket:
            server_socket.close()
            update_message_label("接続を閉じました。")
            server_socket = None  # サーバーソケットをリセット
            
    def end_window():
        nonlocal server_socket
        if server_socket:
            server_socket.close()
            update_message_label("接続を閉じました。")
            server_socket = None  # サーバーソケットをリセット
        window.destroy()
        
    def add_data_to_drop_menu(data):
        """ドロップダウンメニューにデータを追加します。

        Args:
            data (str): ドロップダウンメニューに追加するデータ
        """
        
        """""""""""""""""""""""""""""""""""""""""""""""
        ここに受信したマイクからのデータを処理して座標を割り出す位置推定プログラム関数を記述し、そのデータをdataに格納する。
        するとドロップボックスに値が追加される。なおdataは[座標,座標]形式の文字列で。
        関数例:
        data = position_estimation(data)
        """""""""""""""""""""""""""""""""""""""""""""""
        drop_menu['menu'].add_command(label=data, command=lambda value=data: selected_data.set(value))
        
    def on_decision_button_click():
        """決定ボタンがクリックされたときの処理を行います。"""
        data = selected_data.get()
        # この例では、選択された項目をラベルに表示するだけ
        data_list = data.split(',')
        num1 = int(data_list[0])
        num2 = int(data_list[1])
        
        # 選択された値に応じて任意の処理を追加することができます
        # x_entryの内容を削除
        x_entry.delete(0, tk.END)

        # y_entryの内容を削除
        y_entry.delete(0, tk.END)
        
        #選択した座標を入力欄に入れる
        x_entry.insert(0, num1)  # ここでx座標の初期値を設定
        y_entry.insert(0, num2)  # ここでy座標の初期値を設定
        
        # ボタンをプログラムからクリック
        submit_button.invoke()
        
    def on_selection_change(*args):
        """ドロップダウンメニューの選択が変更されたときの処理を行います。"""
        selected_value = selected_data.get()
        # 選択された項目の処理を行う
        data = selected_value  # 例として与えられたデータ

        # カンマでデータを分割してint型に変換
        data_list = data.split(',')
        num1 = int(data_list[0])
        num2 = int(data_list[1])
        
        # キャンバス上の選択用オブジェクトを更新
        canvas.delete("select")
        if start_photo:
            canvas.create_image(num1, num2, anchor=tk.CENTER, image=start_photo, tag="select")
            
        # この例では、選択したデータをラベルに表示するだけ
        update_message_label(f"選択したデータ: {selected_value}")
    

    # ウィンドウを作成
    window = tk.Tk()
    window.title("UDPサーバー")

    # 接続待機ボタンを作成
    start_button = tk.Button(window, text="接続待機", command=start_server_thread)
    start_button.pack(pady=10)

    # 接続を閉じるボタンを作成
    close_button = tk.Button(window, text="接続を閉じる", command=close_connection)
    close_button.pack(pady=5)

    # ラベルを作成してウィンドウに配置
    message_label = tk.Label(window, text="サーバーが待機中です。", font=("Helvetica", 12))
    message_label.pack(pady=10)

    def update_message_label(new_message):
        """メッセージ表示ラベルを更新する関数"""
        message_label.config(text=new_message)

    # ドロップダウンメニューに表示される選択肢リストを管理する変数
    selected_data = tk.StringVar(window)
    selected_data.set("選択したデータ")
    
    # 選択されたタイミングで動作する関数を登録
    selected_data.trace("w", on_selection_change)

    # ドロップダウンメニューを作成
    drop_menu = tk.OptionMenu(window, selected_data, "選択したデータ")
    drop_menu.pack(pady=5)
    
    # 決定ボタンを作成
    decision_button = tk.Button(window, text="決定", command=on_decision_button_click)
    decision_button.pack(pady=5)
    
    # protocolメソッドを追加してウィンドウが閉じられた際にclose_connection関数を呼び出す
    window.protocol("WM_DELETE_WINDOW", end_window)

    # ウィンドウを表示してイベントループを開始
    window.mainloop()

这篇关于AGV系统控制位置管理功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391899

相关文章

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3