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

news2024/11/17 17:49:33

用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('请输入用户名和密码')

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

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

相关文章

CSS实现选中卡片样式操作

图一默认自动选中&#xff0c;并且不可取消选中&#xff0c;当选择其他卡片才可点击下一步 在 “ src/assets ” 路径下存放 save.png&#xff0c;代表选中的状态 <div class"cards"><ul class"container"><li v-for"image in image…

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

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

【学习笔记】开源计算机视觉库OPENCV学习方案

本文中&#xff0c;我们试图提供一些学习OpenCV的详细和实用资源&#xff0c;这些资源包括基础知识、进阶技巧以及实践项目&#xff0c;旨在帮助初学者和进阶学习者更好地掌握和使用OpenCV库。 一、学习资源 官方文档&#xff1a;OpenCV的官方文档是学习OpenCV的最佳起点。它包…

代码随想录算法训练营第九天

28. 实现 strStr() &#xff08;本题可以跳过&#xff09; 方法&#xff1a; 方法一&#xff1a; 暴力法 i 表示最多能移动到n-m位置&#xff0c; 超过则退出循环。j表示haystack 初始位置k表示needle的初始位置如果haystack [j] needle[k]且 k<m 则 j, k; 如果 km 则返…

P5076 【深基16.例7】普通二叉树(简化版)题解

题目 您需要写一种数据结构&#xff0c;来维护一些数&#xff08;都是绝对值以内的数&#xff09;的集合&#xff0c;最开始时集合是空的。其中需要提供以下操作&#xff0c;操作次数q不超过&#xff1a; 定义数x的排名为集合中小于x的数的个数1。查询数x的排名。注意x不一定…

【操作系统概念】 第3章:进程

文章目录 0.前言3.1进程概念3.1.1 进程3.1.2 进程状态3.1.3 进程控制块&#xff08;PCB&#xff09; 3.2、进程调度3.2.1 调度队列3.2.2 调度程序3.2.3 上下文切换 3.3 进程操作3.3.1 进程创建3.3.2 进程终止 3.4 进程间通信 0.前言 早期的计算机一次只能执行一个程序。这种程序…

c++复习

基础 内存分区 栈&#xff1a; 存放函数的局部变量、函数参数、返回地址等&#xff0c;由编译器自动分配和释放。 堆&#xff1a; 动态申请的内存空间&#xff0c;就是由 malloc 分配的内存块&#xff0c;由程序员控制它的分配和释放&#xff0c;如果程序执行结束还没有释放…

09. C语言内嵌汇编代码

C语言函数内可以自定义一段汇编代码&#xff0c;在GCC编译器中使用 asm 或 __asm__ 关键词定义一段汇编代码&#xff0c;并可选添加volatile关键字&#xff0c;表示不要让编译器优化这段汇编代码。 内嵌汇编代码格式如下&#xff1a; __asm__ ("汇编代码":输出描述…

Linux中给复杂命令起别名

目录 1 前言 2 操作步骤 2.1 打开.bashrc 2.2 编辑.bashrc-添加别名 2.3 使别名生效 1 前言 在linux中有些指令会比较长&#xff0c;为了便捷的使用它们&#xff0c;我们就可以采取起别名的方式&#xff0c;具体操作如下。 2 操作步骤 2.1 打开.bashrc 输入如下指令&a…

SAP PP学习笔记 - 豆知识08 - 如何修改价格

正常的品目修改用MM02。 新建一个品目之后&#xff0c;啥都没干&#xff0c;现在想修改一下价格&#xff0c;发现MM02 修改不了了。 1&#xff0c;MR21 这里注意 转记日付 要和会计期间一致。 比如我这里的会计期间是 2024/03 有关会计期间&#xff0c;可以参照如下文章&am…

【C++】类和对象之初始化列表与static成员

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 再谈构造函数2.1 构造函数体赋值2.2 初始化列表2.3 explicit关键字 3. static成员3.1 概念3.2 特性 1. 前言 在前面的博客中已经分享有关构造函数 【C】构造函数和…

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

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

JRebel and XRebel 插件在IDEA中的安装、激活和使用

1、JRebel安装 1、打开idea->setting->plugins->Marketplace 2、搜索插件JRebel and XRebel&#xff0c;点击安装&#xff0c;然后重启idea 如果左侧出现JRebel & XRebel代表已安装 3.离线安装JRebel 根据自己安装的idea版本进行下载电影的jrebel https://plugi…

表达式求值(中序遍历,)

题目描述&#xff1a; 分析&#xff1a; 此题是acwing的一个模板例题&#xff0c;利用中缀遍历解决&#xff0c;即可。 思路&#xff1a; 首先我们先了解一下什么是树的中序遍历&#xff1f; 中序遍历是 二叉树遍历 的一种&#xff0c;也叫做 中根遍历 、中序周游。 在二叉树中…

重头戏:盒子模型(box-model)

盒子模型(box-model): CSS处理网页时,他认为每一个标签都包含在一个不可见的盒子里面,如果我们将所有的标签都想象成盒子,那么我们对网页的布局就相当于是拜访盒子,我们只需要将相应的盒子摆放在网页中相应的位置就可以完成布局 盒子模型: 一个盒子我们往往会分成: 内容区(…

无法启动报,To install it, you can run: npm install --save @/components/iFrame/index

运行的过程中后台报错 npm install --save /components/iFrame/index&#xff0c;以为是安装三方依赖错误&#xff0c;经过多次重装node_modules依然没有用。 没办法&#xff0c;只能在项目中搜索 components/iFrame/index这个文件。。突然醒悟。。。 有时候&#xff0c;犯迷…

I.MX6ULL_Linux_驱动篇(54)linux 块设备驱动

前面我们都是在学习字符设备驱动&#xff0c;本章我们来学习一下块设备驱动框架&#xff0c;块设备驱动是Linux 三大驱动类型之一。块设备驱动要远比字符设备驱动复杂得多&#xff0c;不同类型的存储设备又对应不同的驱动子系统&#xff0c;本章我们重点学习一下块设备相关驱动…

CSS块元素,CSS的伪类和伪元素

学习建议 在你开始入手学习前&#xff0c;有一些小的建议。根据我自己学习的经验发现&#xff0c;这些建议在现在乃至我以后的岗位生涯里都是有很大帮助的。还有就是开始学习前&#xff0c;建议可以先花几天时间&#xff0c;查找一些如何入门的文章&#xff0c;通过对许多文章…

linux系统Jenkins工具配置webhook自动部署

Jenkins工具webhook自动部署 webhook自动部署webhook的意义操作流程jenkins页面操作gitlab页面操作 webhook自动部署 webhook的意义 自动化部署&#xff1a;Webhook 可以在代码提交、合并请求或其他特定事件发生时自动触发 Jenkins 构建和部署任务&#xff0c;从而实现自动化…

CSS的标准文档流,web设计与开发

CSS篇 让一个元素水平垂直居中&#xff0c;到底有多少种方案&#xff1f;浮动布局的优点&#xff0c;缺点&#xff1f;清除浮动的方式&#xff1f;使用display:inline-block会产生的问题&#xff1f;解决方法&#xff1f;布局题&#xff1a;div垂直居中&#xff0c;左右10px&a…