AGV控制系统实时监控

news/2024/11/29 18:47:42/

import tkinter as tk

from tkinter import Menu

from PIL import Image, ImageTk

import os

from urllib.parse import parse_qs

import mysql.connector

from mysql.connector import Error

import math

db_pass = os.getenv('db_pass')

# 初期_radius変数をグローバル変数として定義

initial_radius = 0

def monitaring():

    # 初期円の半径と増加するサイズ

    global initial_radius

    max_radius = 80

    delta = 1

    animation_interval = 10

    angle = 120

    def draw_circle(canvas, x, y, radius):

        canvas.delete("circle")

        canvas.create_oval(x - radius, y - radius, x + radius, y + radius, outline="blue", tags="circle")

          def rotate_image(image_id, photo):

        """画像を回転させます。

        Args:

            image_id (int): 画像オブジェクトのID

            photo (tk.PhotoImage): 回転する画像

        """

        nonlocal angle

        rotated_image = resized_image.rotate(360 - angle + 180, expand=True)

        photo.image = ImageTk.PhotoImage(rotated_image)

        canvas.itemconfigure(image_id, image=photo.image)

    def animate():

        global initial_radius

        initial_radius += delta

        if initial_radius > max_radius:

            time_event.time_event()

            initial_radius = 0

            canvas.delete("battery")

            if time_event.battery_event() == 1:

                canvas.create_image(840, 60, anchor=tk.CENTER, image=battery_image1, tags="battery")

            elif time_event.battery_event() == 2:

                canvas.create_image(840, 60, anchor=tk.CENTER, image=battery_image2, tags="battery")

            elif time_event.battery_event() == 3:

                canvas.create_image(840, 60, anchor=tk.CENTER, image=battery_image3, tags="battery")

            elif time_event.battery_event() == 4:

                canvas.create_image(840, 60, anchor=tk.CENTER, image=battery_image4, tags="battery")

            elif time_event.battery_event() == 5:

                canvas.create_image(840, 60, anchor=tk.CENTER, image=battery_image5, tags="battery")  

        x_text = time_event.x_point

        y_text = time_event.y_point

        if x_text and y_text:

            x = int(x_text)

            y = int(y_text)

            draw_circle(canvas, x, y, initial_radius)

            canvas.delete("car")

            car= canvas.create_image(x, y, anchor=tk.CENTER, image=center_image, tags="car")

            rotate_image(car, center_image)              

        window.after(animation_interval, animate)

    def set_circle():

        print(123)

    def exit_program():

        print(111)

    window = tk.Toplevel()

    window.title("データ取得アプリ")

    window.geometry("900x650")

    canvas = tk.Canvas(window, width=900, height=549)

    canvas.pack()

    image_path = "car.png"

    original_image = Image.open(image_path)

    new_width = 30

    new_height = 30

    resized_image = original_image.resize((new_width, new_height), Image.FIXED)

    background_image = tk.PhotoImage(file="image.jpg")

    canvas.create_image(0, 0, anchor=tk.NW, image=background_image)

    center_image = ImageTk.PhotoImage(resized_image)

    set_button = tk.Button(window, text="円を設定", command=set_circle)

    set_button.pack()   

    # batteryフル画像

    image_path_additional = "battery_5.png"  # 追加画像のパスに置き換えてください

    original_image_additional = Image.open(image_path_additional)

    new_width_additional = 46  # 必要に応じてサイズを調整してください

    new_height_additional = 95  # 必要に応じてサイズを調整してください

    resized_image_additional = original_image_additional.resize((new_width_additional, new_height_additional), Image.ANTIALIAS)

    battery_image5 = ImageTk.PhotoImage(resized_image_additional)   

    # battery4画像

    image_path_additional = "battery_4.png"  # 追加画像のパスに置き換えてください

    original_image_additional = Image.open(image_path_additional)

    new_width_additional = 46  # 必要に応じてサイズを調整してください

    new_height_additional = 95  # 必要に応じてサイズを調整してください

    resized_image_additional = original_image_additional.resize((new_width_additional, new_height_additional), Image.ANTIALIAS)

    battery_image4 = ImageTk.PhotoImage(resized_image_additional)

   

    # battery3画像

    image_path_additional = "battery_3.png"  # 追加画像のパスに置き換えてください

    original_image_additional = Image.open(image_path_additional)

    new_width_additional = 46  # 必要に応じてサイズを調整してください

    new_height_additional = 95  # 必要に応じてサイズを調整してください

    resized_image_additional = original_image_additional.resize((new_width_additional, new_height_additional), Image.ANTIALIAS)

    battery_image3 = ImageTk.PhotoImage(resized_image_additional)

   

    # batter23画像

    image_path_additional = "battery_2.png"  # 追加画像のパスに置き換えてください

    original_image_additional = Image.open(image_path_additional)

    new_width_additional = 46  # 必要に応じてサイズを調整してください

    new_height_additional = 95  # 必要に応じてサイズを調整してください

    resized_image_additional = original_image_additional.resize((new_width_additional, new_height_additional), Image.ANTIALIAS)

    battery_image2 = ImageTk.PhotoImage(resized_image_additional)

   

    # batter23画像

    image_path_additional = "battery_1.png"  # 追加画像のパスに置き換えてください

    original_image_additional = Image.open(image_path_additional)

    new_width_additional = 46  # 必要に応じてサイズを調整してください

    new_height_additional = 95  # 必要に応じてサイズを調整してください

    resized_image_additional = original_image_additional.resize((new_width_additional, new_height_additional), Image.ANTIALIAS)

    battery_image1 = ImageTk.PhotoImage(resized_image_additional)


 

    # メニューバーを作成

    menubar = Menu(window)

    window.config(menu=menubar)

    # ファイルメニューを作成

    file_menu = Menu(menubar)

    menubar.add_cascade(label="ファイル", menu=file_menu)

    # 終了オプションをファイルメニューに追加

    file_menu.add_command(label="終了", command=exit_program)

    animate()

    window.mainloop()

   

class time_event:

    x_point = 0

    y_point = 0

    @classmethod

    def set_x_point(cls, new_x):

        cls.x_point = new_x

       

    @classmethod

    def set_y_point(cls, new_y):

        cls.y_point = new_y

    def time_event():

        try:

            # データベースに接続

            connector = mysql.connector.connect(user='root', password=db_pass, host='localhost', database='root', charset='utf8mb4')

            cursor = connector.cursor()

           

            # SELECTクエリの作成と実行

            select_query = "SELECT x, y FROM coordinates WHERE id = 1;"

            cursor.execute(select_query)

           

            # 結果の取得

            result = cursor.fetchone()

           

            # リソースを解放

            cursor.close()

            connector.close()

           

            time_event.set_x_point(result[0])

            time_event.set_y_point(result[1])

           

            #値調節要SQL

           

            #UPDATE coordinates SET x = 300, y = 250 WHERE id = 1;

        except Error as e:

            # エラーメッセージを返す

            return {"error": str(e)}

   

    def battery_event():

        """

        try:

            # データベースに接続

            connector = mysql.connector.connect(user='root', password=db_pass, host='localhost', database='root', charset='utf8mb4')

            cursor = connector.cursor()

           

            # SELECTクエリの作成と実行

            select_query = "SELECT battery_state FROM battery_status WHERE id = 1;"

            cursor.execute(select_query)

           

            # 結果の取得

            result = cursor.fetchone()

           

            # リソースを解放

            cursor.close()

            connector.close()

           

            return result[0]      

        except Error as e:

            return {"error": str(e)}

        """    

        return 3


 


http://www.ppmy.cn/news/1212383.html

相关文章

【电源专题】POE 802.3af/at与802.3bt在握手阶段有什么差异

在文章:【电源专题】PSE如何与PD握手协商功率等级?中我们以PSE与PD设备在802.3af/at协议握手为例,讲到了PSE与PD协商时通过三个阶段:检测阶段、握手阶段、电压提升阶段。而对于802.3bt的握手存在明显的不同,所以本文就详细解释一下802.3bt协议为什么握手阶段与802.3af/at存…

Python与ArcGIS系列(六)查找和修复数据源

目录 0 简述1 查找丢失数据源2 findAndReplaceWorkspacePaths()方法修复丢失数据源3 replaceWorkspaces()方法修复丢失数据源4 replaceDataSource()修复单个图层和表对象0 简述 当对数据源进行移动、转换和删除时都会导致数据源丢失链接问题,无法正常显示地图数据。对于多个数…

工作不再迷茫!每次会议都做纪要,为何如此关键?

Hey 小伙伴们,小米来啦!大家好呀~ 最近有一个话题一直在我的脑海中翻腾,觉得有必要和大家分享一下。没错,就是我们工作中再熟悉不过的“会议纪要”!为什么每次会议都要做会议纪要呢?有人觉得这是一项繁琐的…

Linux安装MySQL8.0服务

Linux安装MySQL8.0服务 文章目录 Linux安装MySQL8.0服务一、卸载1.1 查看mariadb1.2 卸载 二、安装2.1 下载2.2 上传2.3 解压2.4 重命名2.5 删除2.6 创建目录2.7 环境变量2.8 修改配置2.9 配置文件2.9 用户与用户组2.10 初始化2.11 其它 三、开启远程连接MySQL 一、卸载 首先第…

Python数据容器(字符串)

字符串 1.字符串 字符串也是数据容器的一种,字符串是字符的容器,一个字符串可以存放任意数量的字符。 2.字符串的下标索引 从前向后,下标从0开始从后向前,下标从-1开始 # 通过下标索引获取特定位置的字符 name python print(na…

【java:牛客每日三十题总结-6】

java:牛客每日三十题总结 总结如下 总结如下 transient 变量和序列化有关,这是一个空接口,起标记作用,具体的序列化由ObjectOutputStream和ObjectInputStream完成。transient修饰的变量不能被序列化,static变量不管加没加transie…

亚马逊云AI应用科技创新下的Amazon SageMaker使用教程

目录 Amazon SageMaker简介 Amazon SageMaker在控制台的使用 模型的各项参数 pytorch训练绘图部分代码 Amazon SageMaker简介 亚马逊SageMaker是一种完全托管的机器学习服务。借助 SageMaker,数据科学家和开发人员可以快速、轻松地构建和训练机器学习模型&#…

Antd React Form.Item内部是自定义组件怎么自定义返回值

在线演示https://stackblitz.com/edit/stackblitz-starters-xwtwyz?filesrc%2FSelfTreeSelect.tsx 需求 当我们点击提交,需要返回用户名和选中树的id信息,但是,我不关要返回树的id信息,还需要返回选中树的名称 //默认返回的 {userName:梦洁,treeInfo:leaf1-value } //但是需…