声明
该模板用于在window上快速构建shinyGUI,为了我本人便于查阅,完整及更多功能参照官网
批处理部分
在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)