streamlit初学-用streamlit实现云台控制界面

用streamlit实现云台控制界面

  • 效果图
    • PC上的效果
    • 手机上的效果
  • 源码:

本文演示了,如何用streamlit做一个云台控制界面。功能包括:用户登录,事件的处理,图片的更新

版本信息:

  • streamlit_authenticator: 下载链接
  • streamlit : 1.31.1
  • python: 3.11

修改点:

  • streamlit_authenticator 从bcrypt.hashpw改成hashlib.sha256(以提升速度)

效果图

PC上的效果

在这里插入图片描述
在这里插入图片描述

手机上的效果

在这里插入图片描述

源码:

import streamlit as st  #1.31.1
import cv2
import numpy as np
import datetime
import glob
import os
import sys
sys.path.append(".")
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoaderdef get_image(kwargs):'''生成图片,删除旧图片'''print(kwargs)image=np.ones((240,320,3),dtype=np.uint8)*128current_time = datetime.datetime.now()date_format ='%Y%m%d%H%M%S'time_string = current_time.strftime(date_format)for name in glob.glob("img_cache/*.png"):date_object = datetime.datetime.strptime(os.path.basename(name).split(".")[0], date_format)if (current_time-date_object).total_seconds()>60:os.remove(name)font = cv2.FONT_HERSHEY_SIMPLEX    label=[time_string]for k,v in kwargs.items():if v:label.append(k)cv2.putText(image, "-".join(label), (1, 32), font, 0.6, (255, 255, 255),1, cv2.LINE_AA)ok, img = cv2.imencode('.png', image, [cv2.IMWRITE_JPEG_QUALITY,20])filename="img_cache/{}.png".format(time_string)with open(filename,"wb") as f:f.write(img.tobytes())return filenamedef mainContent(): '''主界面'''# 初始化状态if 'last_image' not in st.session_state:st.session_state['last_image'] = None# UI布局with st.container(border=True):        st.write("云台控制")col1, col2,col3,col4 = st.columns([0.3,0.3,0.3,0.3])with col1:st.button(':arrow_up:',use_container_width=True,kwargs={'type':"up"},key="up_btn")with col2:st.button(':arrow_down:',use_container_width=True,kwargs={'type':"down"},key="down_btn")    with col3:st.button(':arrow_left:',use_container_width=True,kwargs={'type':"left"},key="left_btn")   with col4:    st.button(':arrow_right:',use_container_width=True,kwargs={'type':"right"},key="right_btn")        with st.container(border=True):st.write("预置点控制")preset = st.slider('预置点', 1, 10, 1)st.button('跳转到预置点',use_container_width=False,kwargs={'type':"down"},key="goto_btn") with st.container(border=True):st.write("预览")placeholder = st.empty()# 事件处理逻辑if st.session_state.up_btn or st.session_state.down_btn:with placeholder.container():st.session_state["last_image"]=get_image({"up_btn":st.session_state.up_btn,"down_btn":st.session_state.down_btn})if st.session_state.left_btn or st.session_state.right_btn:with placeholder.container():st.session_state["last_image"]=get_image({"left_btn":st.session_state.left_btn,"right_btn":st.session_state.right_btn})if st.session_state.goto_btn:with placeholder.container():st.session_state["last_image"]=get_image({"goto_btn":st.session_state.goto_btn,"preset":preset})if st.session_state["last_image"]:st.image(st.session_state["last_image"])if __name__ == "__main__":# 设置标题,图标等st.set_page_config(layout="centered",page_title="云台控制",page_icon=":shark:")# 设置自定义样式button_styles = {'width': '54px','-webkit-box-align': 'center','align-items': 'center','-webkit-box-pack': 'center','justify-content': 'center',   'display': 'flex','padding': '10px'}st.write('<style>div.row-widget.stButton{ %s }</style>' % button_styles, unsafe_allow_html=True)st.markdown('<style>section.css-vk3wp9.eczjsme11{display: none;}</style>', unsafe_allow_html=True)# 鉴权with open('config.yaml') as file:config = yaml.load(file, Loader=SafeLoader)authenticator = stauth.Authenticate(config['credentials'],config['cookie']['name'],config['cookie']['key'],config['cookie']['expiry_days'],config['preauthorized'])   authenticator.login()if st.session_state["authentication_status"]:authenticator.logout()mainContent()elif st.session_state["authentication_status"] is False:st.error('用户名或密码错误')elif st.session_state["authentication_status"] is None:st.warning('请输入用户名和密码')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AndroidStudio安装Android模拟器AVD及遇到的问题解决

打开DeiviceManager 创建虚拟机 选个常规的1080*1920分辨率 这里就遇到一个报错&#xff1a; Android SDK is up to date. Running Android Emulator hypervisor driver installer [SC] ControlService 失败 1062: 服务尚未启动。 [SC] DeleteService 成功 [SC] 由于发生错误…

【大数据运维】大数据常见shell命令

文章目录 一、 Zookeeper常用命令1. zk服务命令2. zk客户端命令 二、HBASE常见运维命令1. 集群启动关闭2. 扩容增加regionserver3. 下线regionserver ing 一、 Zookeeper常用命令 例如&#xff1a;ZOOKEEPER_HOME&#xff1a;/opt/zk/zookeeper 1. zk服务命令 1. 启动ZK服务…

在线部署ubuntu20.04服务器,安装jdk、mysql、redis、nginx、minio

查看服务器版本为20.04 lsb_release -a服务器初始账号密码 sxd / 123456 首先,更改自身密码都输入123456 sudo passwd 创建最高权限root账号&#xff0c;密码为 123456 su root 更新源列表 sudo apt-get update 安装 openssh-server和vim&#xff0c;途中输入y sudo ap…

Effective C++ 学习笔记 条款10 令operator=返回一个reference to *this

关于赋值&#xff0c;有趣的是你可以把它们写成连锁形式&#xff1a; int x, y, z; x y z 15; // 赋值连锁形式同样有趣的是&#xff0c;赋值采用右结合律&#xff0c;所以上述连锁赋值被解析为&#xff1a; x (y (z 15));这里15先被赋值给z&#xff0c;然后其结果&…

Python爬虫:设置随机 User-Agent

Python爬虫&#xff1a;设置随机 User-Agent 在Python中编写爬虫时&#xff0c;为了模拟真实用户的行为并防止被服务器识别为爬虫&#xff0c;通常需要设置随机的User-Agent。你可以使用fake-useragent库来实现这一功能。首先&#xff0c;你需要安装fake-useragent库&#xff…

通过Apple Configurator 2导出iOS ipa包

通过Apple Configurator 2导出iOS ipa包 安装Apple Configurator 2 从Mac AppStore安装Apple Configurator 2 下载ipa 准备工作&#xff1a; 1、 电脑已经安装了Apple Configurator 2 2、 手机已经安装了目标软件 3、 Apple 账号已经下载过目标软件 打开后连接设备&#xf…

如何快速分析OB集群日志,敏捷诊断工具obdiag分析能力实践——《OceanBase诊断系列》之四

1. 前言 obdiag是OceanBase的敏捷诊断工具。1.2版本中&#xff0c;obdiag支持快速收集诊断信息&#xff0c;但仅有收集能力是不够的&#xff0c;还需要有分析能力。因此在obdiag的1.3.0版本中&#xff0c;我们加入了OB集群的日志分析功能。用户可以一键进行集群的OB日志的分析…

Redis核心数据结构之SDS(二)

SDS与C字符串的区别 杜绝缓冲区溢出 除了获取字符串长度的复杂度高之外&#xff0c;C字符串不记录自身长度带来的另一个问题是 容易造成缓冲区溢出(buffer overflow).例如<string.h>/strcat函数可以将src字符串 中的内容拼接到dest字符串的末尾: char *strcat(char *d…

c++中多种类型sort()排序的用法(数组、结构体、pair、vector)

c中多种类型sort排序的用法 一、对数组排序1、默认排序2、自定义排序 二、对结构体进行排序三、对pair进行排序1、默认排序2、自定义排序 四、对vector进行排序1、默认排序2、去重排序3、自定义排序 一、对数组排序 1、默认排序 默认从小到大进行排序 #include <bits/std…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:拖拽控制)

设置组件是否可以响应拖拽事件。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 ArkUI框架对以下组件实现了默认的拖拽能力&#xff0c;支持对数据的拖出或拖入响应&#xff0c;开发者只需要将这些组件…

Xcode 15 适配 MonkeyDev

升级到Xcode15后,使用Xcode创建MonkeyApp后,运行会报错,本篇文章主要讲述此过程遇到的错误和解决办法。 问题1:找不到libc++.dylib文件 问题描述: Build input files cannot be found: /usr/lib/libstdc++.dylib, /usr/lib/libc++.dylib. Did you forget to declare th…

DHCP自动获取IP地址实验(华为)

思科设备参考&#xff1a;DHCP自动获取IP地址实验&#xff08;思科&#xff09; 一&#xff0c;实验目的 路由器搭载DHCP&#xff0c;让PC通过DHCP自动获取IP地址 二&#xff0c;不划分vlan--全局地址池 实验拓扑 配置命令 Router <Huawei>system-view [Huawei]ip po…

瑞_Redis_短信登录(一)

文章目录 项目介绍1 短信登录1.1 项目准备1.1.1 导入SQL1.1.2 导入后端项目1.1.3 导入前端项目 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的项目准备小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识&#xff0c;所以本系…

服务器内部错误的解决办法

服务器内部错误的解决办法 一、识别问题根源 首先&#xff0c;当服务器发生内部错误时&#xff0c;我们需要迅速识别问题的根源。服务器内部错误可能是由于软件问题、硬件故障或者网络问题等多种原因引起的。对于软件问题&#xff0c;我们可以通过查看服务器日志文件或者错误报…

LLM春招,搜广推,nlp(2)

Encoder和Decoder怎么交互的 decoder里面的K&#xff0c;V输入用的是encoder的输出&#xff0c;并不是共享了K, V参数&#xff0c;decoder每层的参数都是独立的。Decoder每层是有两块Attention的&#xff1a;一块是正常的Self-Attention&#xff0c;QKV的输入都来自Decoder上一…

C++之获取当前程序的路径、Windows目录的路径和系统目录的路径

在Windows操作系统中&#xff0c;程序的路径、Windows目录的路径和系统目录的路径通常指的是以下三个不同的概念&#xff1a; 当前程序的路径&#xff1a;指的是执行中的程序文件所在的完整路径。例如&#xff0c;如果你的程序名为MyApp.exe&#xff0c;并且它位于C:\Program …

Adobe Acrobat Pro DC 2023:提升工作效率,激发创意灵感 mac/win版

Adobe Acrobat Pro DC 2023是一款功能强大的PDF编辑和管理工具&#xff0c;专为现代职场人士设计。这款软件不仅继承了Adobe一贯的高品质和稳定性&#xff0c;还针对用户需求进行了诸多创新和改进。 Adobe Acrobat Pro DC 2023软件获取 首先&#xff0c;Adobe Acrobat Pro DC…

docker单节点搭建在线商城

本文档使用到的软件包以上传到资源中 目录 1. 创建容器并配置基础内容 1.1 将gpmall-repo上传到容器中 1.2 添加yum源 2. 安装基础服务 2.1 安装JAVA环境 2.2 安装Redis缓存服务 2.3 安装Elasticsearch服务 2.4 安装Nginx服务 2.5 安装MariaDB数据库 2.6 安…

C++核心编程之内存分区模型,引用,函数提高

1&#xff0c;类型分区模型 c程序在执行中&#xff0c;将内存大方向划分为4个区域 1&#xff0c;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 2&#xff0c;全局区&#xff1a;存放全局变量和静态变量以及常量 3&#xff0c;栈区&#xff1…

Spring框架的优点

Spring框架是一个开放源代码的J2EE应用程序框架&#xff0c;是针对bean的生命周期进行管理的轻量级容器。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题&#xff0c;提供了功能强大的IOC、AOP及Web MVC等功能。 轻量级&#xff1a;相对于EJB框架而言。 Spring 体系结…