【python-shiny】个人用shiny控件模板

声明

该模板用于在window上快速构建shinyGUI,为了我本人便于查阅,完整及更多功能参照官网

Shiny

批处理部分

在window下使用dos命令直接启动shiny程序

::关闭回显
@echo off
::设置中文编码
chcp 65001
::============================================
::标题
title shiny控制程序启动
::窗口设置
color 02
mode con cols=100 lines=25
::中断
::echo push any button to start &pause > nul

::===================程序头部=======================
::输入提示符
echo 本程序用于启动web程序
echo 当前批处理文件所在路径为:%~dp0
echo 切换目录至当前路径
cd /d %~dp0
echo web程序已启动,关闭本bat文件将会关闭web服务

shiny run --reload --launch-browser .\Apps.py

::===================程序尾部=======================
chcp
pause

python-shiny程序

shiny库环境的安装及声明

#=====================【运行程序的准备】==================================    -
#运行shiny程序需要安装相应的库                                                -
#pip install shiny                                                          -
#控制modbus需要先安装:pip3 install pymodbus==2.5.3                          -
#读取外部数据需要安装:pip3 install pandas                                    -
#读取xlsx文件需要额外安装pip install openpyxl                                 -
#删除方法::pip uninstall [库名称]                                            -
#======================【程序的启动方式】=================================    -
#程序在控制台终端使用web浏览器启动                                             - 
#shiny run --reload --launch-browser .\相对路径\Apps.py  
# shiny run --reload --launch-browser .\Apps.py                              -

模板程序本体

#======================【头文件】==============================
#-------------shinyAPP头文件--------------
import asyncio                                      #这个库用于编写单线程并发代码,使用 async/await 语法
from shiny import reactive,render,App, ui         #shiny 核心库中的 App 对象,需要注意shiny.express 和 shiny 核心库的 App 类是不兼容的     


#=================自定义全局函数1=====================
def GL_fun(var):
    print(f"这段文字你会在指令行中看到,传递的参数为{var}")
    return (f"这段文字你会在web中看到,传递的参数为{var}")



#======================【UI界面】==============================
#'''

app_ui = ui.page_navbar(
    ui.nav_panel(
        "可选页A", ui.HTML(
        "<h1>指定<strong>一级</strong>标题</h1>"
        "<h5>5级标题</h5>"
        "<h4>4级标题</h4>"
        "<p>段落</p>"
        ),
        ui.input_text("LAB_A_text", label="标签A"),
        ui.output_text("input_A_data"),
        ui.input_action_button("btnA", "按钮A"),
        ui.input_action_button("btnB", "按钮B"),
        ui.input_action_button("btnC", "按钮C"),
        ui.output_text("btnA_times"),  
        ui.output_text("btnB_times"),  
        ui.output_text("btnC_times"),  
        ui.output_text("dataA"),  
        ui.output_text("dataB"),  
        ui.output_text("dataC"),  
        ),

    ui.nav_panel("可选页B", "自动填充文本"),

    ui.nav_panel("可选页C",ui.HTML(
        "<h1>指定<strong>一级</strong>标题</h1>"
        "<h5>5级标题</h5>"
        "<h4>4级标题</h4>"
        "<p>段落</p>"
        ),),
        
    title="程序标题"
)

#======================【FUNCTION功能】==============================

def server(input, output, session):
    #=============!数据IO检测!==================
    #==实时输出输入的数据(实时检测输入数据)===
    @render.text
    def input_A_data():       
        return f"输入的数据为: {input.LAB_A_text()}"
    #==当事件触发时执行(检测点击的按钮次数)==
    @render.text()
    @reactive.event(input.btnA)
    def btnA_times():
        return f"已触发按钮A点击事件{input.btnA()}次"
    #==当事件触发时执行(检测点击的按钮次数)==
    @render.text()
    @reactive.event(input.btnB)
    def btnB_times():
        return f"已触发按钮B点击事件{input.btnA()}次"
    #==当事件触发时执行(检测点击的按钮次数)==
    @render.text()
    @reactive.event(input.btnC)
    def btnC_times():
        return f"已触发按钮C点击事件{input.btnC()}次"
    

    #================!按钮触发传递参数!============
    #==当事件触发时执行(检测指令传递参数情况)==
    @render.text()
    @reactive.event(input.btnA)
    async def dataA():
        #door_single_ctrl(int(input.LAB_A_text()),1)   #传递参数

        await asyncio.sleep(2) # 设定计算或程序执行时的等待时间
        return f"对输入数据{input.LAB_A_text()}触发指定程序A"

    
    #==当事件触发时执行(检测指令传递参数情况)==
    @render.text()
    @reactive.event(input.btnB)
    async def dataB():
        #door_single_ctrl(int(input.LAB_A_text()),0)
        await asyncio.sleep(2) # 设定计算或程序执行时的等待时间
        return f"对输入数据{input.LAB_A_text()}触发指定程序B"
    
    #==当事件触发时执行(检测指定程序的数据回传)==
    @render.text()
    @reactive.event(input.btnC)
    async def dataC():
        #data_str=door_signal_status(int(input.LAB_A_text()))
        #调用全局函数传递指令行打印结果
        data_str=GL_fun(int(input.LAB_A_text()))

        await asyncio.sleep(2) # 设定计算或程序执行时的等待时间
        #return f"输入的数据为:{input.LAB_A_text()}"
        #这里直接程序C传递输出的数据
        return data_str

#======================【主程序启动】==============================
app = App(app_ui, server)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值