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 SafeLoader

def get_image(kwargs):
    '''
    生成图片,删除旧图片
    '''
    print(kwargs)
    image=np.ones((240,320,3),dtype=np.uint8)*128
    current_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 filename
    
def 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('请输入用户名和密码')

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式】字体极限瘦身术:Fontmin在嵌入式UI中的魔法应用(附3500常用汉字)

1. 概述 在嵌入式系统的用户界面&#xff08;UI&#xff09;设计中&#xff0c;字体的选择和优化至关重要。一个恰当的字体不仅能够提升用户体验&#xff0c;还能彰显产品特色。然而&#xff0c;由于嵌入式设备常常受限于存储空间和处理能力&#xff0c;大型字体文件可能成为性…

arkTS语法

lineHeight与css不同&#xff1f; 1、arkTS是什么 在继承了TS语法的基础上&#xff0c;主要扩展了声明式UI开发相关的能力 声明式UI是一种编写用户界面的范式。 2、声明组件的完整语法 3、自定义组件的语法使用 struct arkTS新增的关键字&#xff0c;是用于自定义组件或者自…

餐饮行业咨询数据在哪里查找?

1.中国饭店协会&#xff1a;国资委和商务部等政府指导发展&#xff0c;参与制定行业国家标准、行业标准与行业自律规则。按月出版《中国饭店业》会员刊物、及时更新协会官方网站和官方微信&#xff0c;方便会员单位及时掌握国内外饭店与餐饮业的最新动态。宣传企业经典案例、反…

使用jquery的autocomplete属性实现联想补全操作

平时使用百度&#xff0c;淘宝等软件搜索时&#xff0c;常见一个搜索框联想提示&#xff0c;感觉确实好用但没有研究过原理&#xff0c;最近恰巧工作中遇到一个同样的场景&#xff0c;不同于大厂使用高端的Python&#xff0c;这次需要使用jQuery的autocomplete属性来自动联想补…

【深度学习笔记】6_7 门控循环单元(GRU)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.7 门控循环单元&#xff08;GRU&#xff09; 上一节介绍了循环神经网络中的梯度计算方法。我们发现&#xff0c;当时间步数较大或者…

vue 下载的插件从哪里上传?npm发布插件详细记录

文章参考&#xff1a; 参考文章一&#xff1a; 封装vue插件并发布到npm详细步骤_vue-cli 封装插件-CSDN博客 参考文章二&#xff1a; npm发布vue插件步骤、组件、package、adduser、publish、getElementsByClassName、important、export、default、target、dest_export default…

HTML静态网页成品作业(HTML+CSS+JS)——和平精英介绍设计制作(4个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有4个页面。 二、作品…

Pytorch学习 day08(最大池化层、非线性激活层)

最大池化层 最大池化&#xff0c;也叫上采样&#xff0c;是池化核在输入图像上不断移动&#xff0c;并取对应区域中的最大值&#xff0c;目的是&#xff1a;在保留输入特征的同时&#xff0c;减小输入数据量&#xff0c;加快训练。参数设置如下&#xff1a; kernel_size&#…

微信加好友频繁会被封号吗?

微信加好友频繁会被封号吗&#xff1f; 微信规定,每个人每天最多可以加20个好友&#xff0c;但一天之内如果频繁加好友&#xff0c;微信可能会出现异常提示&#xff0c;需要暂停好友添加操作。 面对微信上突如其来的大量好友申请&#xff0c;一定要谨慎处理&#xff0c;以免被…

Golang搭建grpc环境

简介 OS : Windows 11 Golang 版本: go1.22.0 grpc : 1.2 protobuffer: 1.28代理 没有代理国内环境下载不了库七牛CDN &#xff08;试过可用&#xff09; go env -w GOPROXYhttps://goproxy.cn,direct阿里云代理(运行grpc时下载包出现报错 ): go env -w GOPROXYhttps://mirr…

CCProxy代理服务器地址的设置步骤

目录 前言 一、下载和安装CCProxy 二、启动CCProxy并设置代理服务器地址 三、验证代理服务器设置是否生效 四、使用CCProxy进行代理设置的代码示例 总结 前言 CCProxy是一款常用的代理服务器软件&#xff0c;可以帮助用户实现网络共享和上网代理。本文将详细介绍CCProxy…

IntelliJ IDEA 2020.2.4试用方法

打开idea&#xff0c;准备好ide-eval-resetter压缩包。 将准备好的压缩包拖入idea中 选中弹窗中的自动重置选项&#xff0c;并点击重置 查看免费试用时长

[数据集][目标检测]变电站缺陷检测数据集VOC+YOLO格式8307张17类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8307 标注数量(xml文件个数)&#xff1a;8307 标注数量(txt文件个数)&#xff1a;8307 标注…

汽车大灯汽车尾灯破裂裂纹破损破洞掉角崩角等问题能修复吗?修复后需要注意什么?

汽车灯罩破损修复后&#xff0c;车主需要注意以下几点&#xff1a; 检查修复效果&#xff1a;修复完成后&#xff0c;车主应该仔细检查灯罩的修复效果&#xff0c;确保破损部分已经被填补并恢复原有的透明度和光泽。如果修复效果不理想&#xff0c;需要及时联系维修店进行处理…

问题:前端获取long型数值精度丢失,后面几位都为0

文章目录 问题分析解决 问题 通过接口获取到的数据和 Postman 获取到的数据不一样&#xff0c;仔细看 data 的第17位之后 分析 该字段类型是long类型问题&#xff1a;前端接收到数据后&#xff0c;发现精度丢失&#xff0c;当返回的结果超过17位的时候&#xff0c;后面的全…

什么是工业级物联网智能网关?如何远程控制PLC?

在这个信息爆炸的时代&#xff0c;物联网技术已经逐渐渗透到我们生活的方方面面&#xff0c;而工业级物联网智能网关作为连接工业设备和云端的重要桥梁&#xff0c;更是引领着工业4.0时代的浪潮。那么&#xff0c;究竟什么是工业级物联网智能网关呢&#xff1f;今天&#xff0c…

git删除comimit提交的记录

文章目录 本地的删除远程同步修改上次提交更多详情阅读 本地的删除 例如我的提交历史如下 commit 58211e7a5da5e74171e90d8b90b2f00881a48d3a Author: test <test36nu.com> Date: Fri Sep 22 20:55:38 2017 0800add d.txtcommit 0fb295fe0e0276f0c81df61c4fd853b7a00…

详解DNS服务

华子目录 概述产生原因作用连接方式 因特网的域名结构拓扑分类域名服务器类型划分 DNS域名解析过程分类解析图图过程分析注意 搭建DNS域名解析服务器概述安装软件bind服务中的三个关键文件 配置文件分析主配置文件共4部分组成区域配置文件作用区域配置文件示例分析正向解析反向…

STM32代码调试时遇到的一些error和warning

持续更新 ERROR WARNING 1.Note: object file renamed from “xxx.o“ to “xxx_1.o“ 出现下面这些warning可能的原因&#xff1a; &#xff08;1&#xff09;没有将头文件加入到main.c中&#xff0c;检查一下在编译。 &#xff08;2&#xff09;修改源文件路径的时候忘记…

python学习the sixth day

python函数进阶 一、函数多返回值 二、函数的多种参数使用 1.位置参数 2.关键字参数 3.缺省参数 设置默认值&#xff0c;必须放在最后面 4.不定长参数 4.总结 三、匿名函数 1.函数作为参数传递 这是计算逻辑的传递&#xff0c;而非数据的传递 2.lambda匿名函数 python文件操…