如何使用Python构建简单的UI?_python如何做ui

liftword2个月前 (02-16)技术文章29

全文共3154字,预计学习时长8分钟



借助Streamlit框架,使用用户界面展示Python项目变得前所未有的简单,你可以仅仅使用Python代码来构建基于浏览器的UI。


本次演示将为迷宫求解器程序构建UI。


Streamlit


Streamlit是一种Web框架,旨在供数据科学家使用Python轻松部署模型和可视化。它运行速度既快又简约,代码既漂亮又对用户友好。


它们是有用于用户输入的内置小部件,例如图像上载、滑块、文本输入,以及其他熟悉的HTML元素(例如复选框和单选按钮)。每当用户与简化的应用程序进行交互时,python脚本就会从头到尾重新运行,这是在考虑应用程序的不同状态时要记住的重要概念。


使用pip安装Streamlit:


Pip install streamlit


并在python脚本上运行streamlit:


Streamlit run app.py


使用例子


我在上一篇文章中演示构建了一个Python程序(
https://towardsdatascience.com/solving-mazes-with-python-f7a412f2493f),该程序将解决给定图像文件和起始/结束位置的迷宫。


现在,我希望将此程序变成一个单页Web应用程序,用户可以在其中上传迷宫图像(或使用默认迷宫图像),调整迷宫的开始和结束位置,并查看最终解决的迷宫。


首先,为图像上传器创建UI,并选择使用默认图像的选项。可以使用st.write()或st.title()之类的函数添加文本输出,使用streamlit的st.file_uploader()函数存储动态上传的文件。最后,st.checkbox()将根据用户是否已选中复选框返回一个布尔值。


import streamlit as st
         import cv2
         import matplotlib.pyplot as plt
         import numpy as np
         import maze
                   st.title('Maze Solver')
         uploaded_file = st.file_uploader("Choose an image", ["jpg","jpeg","png"]) #image uploader
         st.write('Or')
         use_default_image = st.checkbox('Use default maze')


结果:


然后,可以将默认图像或上传的图像读取为可用的OpenCV图像格式。


if use_default_image:
                       opencv_image = cv2.imread('maze5.jpg')
                                     elif uploaded_file isnotNone:
                       file_bytes = np.asarray(bytearray(uploaded_file.read()), dtype=np.uint8)
                       opencv_image = cv2.imdecode(file_bytes, 1)


上载图像后,要显示标记有起点和终点的图像。将使用滑块允许用户重新定位这些点。st.sidebar()函数在页面上添加了一个侧边栏,st.slider()在定义的最小值和最大值内接受数字输入,你可以根据迷宫图像的大小动态定义滑块的最小值和最大值。


if opencv_image isnotNone:
                st.subheader('Use the sliders on the left to position the start and endpoints')
                start_x = st.sidebar.slider("Start X", value=24if use_default_image  else50, min_value=0, max_value=opencv_image.shape[1], key='sx')
                start_y = st.sidebar.slider("Start Y", value=332if use_default_image  else100, min_value=0, max_value=opencv_image.shape[0], key='sy')
                finish_x = st.sidebar.slider("Finish X", value=309if use_default_image  else100, min_value=0, max_value=opencv_image.shape[1], key='fx')
                finish_y = st.sidebar.slider("Finish Y", value=330if use_default_image  else100, min_value=0, max_value=opencv_image.shape[0], key='fy')
                marked_image = opencv_image.copy()
                circle_thickness=(marked_image.shape[0]+marked_image.shape[0])//2//100#circle thickness based on img size
                cv2.circle(marked_image,(start_x, start_y), circle_thickness, (0,255,0),-1)
                cv2.circle(marked_image,(finish_x, finish_y), circle_thickness, (255,0,0),-1)
                st.image(marked_image,channels="RGB", width=800)


每当用户调整滑块时,图像都会快速重新渲染,并且点会更改位置。


一旦用户确定了开始位置和结束位置,就需要一个按钮来解决迷宫并显示解决方案。仅在其子进程运行时显示st.spinner()元素,并且使用st.image()调用显示图像。


if marked_image isnotNone:
                if st.button('Solve Maze'):
                    with st.spinner('Solving your maze'):
                        path = maze.find_shortest_path(opencv_image,(start_x,start_y),(finish_x, finish_y))
                    pathed_image = opencv_image.copy()
                    path_thickness = (pathed_image.shape[0]+pathed_image.shape[0])//200
                    maze.drawPath(pathed_image,path, path_thickness)
                    st.image(pathed_image,channels="RGB", width=800)




瞧瞧,不需要编写任何传统的前端代码,我们用不到40行代码为Python图像处理应用程序创建了一个简单的UI。



事实上, Streamlit除了能够消化简单的Python代码之外,无论用户与页面进行交互还是更改了脚本,Streamlit都会从上至下智能地重新运行脚本的必要部分,这样可以实现直接的数据流和快速开发,它让一切变得简单!


留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

相关文章

十个顶级Python 图形界面(GUI)框架供你选择

你知道嘛由于Python越来越受欢迎,并得到广泛采用,它将成为2020年流行起来的编程语言。在牢固掌握Python编程基础之后,初学者面临的下一个挑战是构建用户界面。幸运的是,有很多Python框架专...

Python GUI教程(十):创建一个复杂的GUI

本篇将会涉及: 构建一个更加复制的GUI在选项卡部件中应用多个层级添加一个树部件和一个日历部件使用一个刻度盘部件来控制一个LCD显示器部件上的数字连接刻度盘部件和LCD部件到一个单选按钮上使用一个单选...

八款常用的 Python GUI 开发框架推荐

前言本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者: 乔柯PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获...

Python用20行代码就能实现漂亮的网页界面?你确定不来看看

我们在写一个网站或者一个网页界面的时候,需要学习很多东西,对小白来说很困难!比如我要做一个简单的网页交互:要懂后端,比如Python里面的Django或者Flask,或者是Java里面的SpringB...

Python大佬手把手教你用wxPython模块编写界面程序

wxPython是一个开发桌面端图形界面的跨平台函数库,开发语言为Python,它是基于C++的函数库wxWidgets的封装。私信小编01即可获取Python学习资料wxpython有大量组件,它们...