使用python开发GUI程序-用网页做界面

news2024/11/17 19:41:48

1.背景

之前一直使用PysimpleGUI来做带图形界面的程序,每次都需要编译成exe发给别人用,一来版本更新就要通知挨个通知更新,二来显示的界面也比较丑,要看大面积的数据,就不方便。

今天午餐时问了一下AI,把我的需求告诉它,它推荐我使用Flask库来实现,详细提出需求,跟它结对编程,大概1个小时,把这个框架和部分代码完成了。

2.成果展示

这是一个日志查看器,可以选择文件,按照时间,设备名称和类型来筛选日志,也可以用正则表达式搜索,并导出搜索结果。实际上它的核心功能是:

grep -E "2024-03-14|A012|"03 03 02" logs.log

通过界面把其中的搜索参数配置好,不需要每次完整的手敲grep 条件。

723cedc56a4f4c4ea226238c0a17ee45.png

3.关键代码

整体由一个python程序和一个html程序构成,都是GPT-4生成的,我做了一些修改。

主要是两点:

1.它不太理解我的搜索条件,以为是下拉框,我改成输入框,然后还有一些引用错误。

2.我希望导入文件后,立即展示在内容显示框,增加了一个联动操作。

from flask import Flask, render_template, request, send_file
import os
import re
import gzip
import json
from datetime import datetime

app = Flask(__name__)

# 日志文件路径
LOG_DIR = 'logs'

# 获取日志文件列表及元数据
def get_log_files():
    files = os.listdir(LOG_DIR)
    log_files = []
    for file in files:
        if file.endswith('.log') or file.endswith('.log.gz'):
            file_path = os.path.join(LOG_DIR, file)
            start_time, end_time, device_types, log_types = parse_log_metadata(file_path)
            log_files.append({
                'name': file,
                'start_time': start_time,
                'end_time': end_time,
                'device_types': device_types,
                'log_types': log_types
            })
    return log_files
#省略80行

def read_log_file(file_path, regex):
    logs = []
    if file_path.endswith('.log.gz'):
        with gzip.open(file_path, 'rt') as f:
            for line in f:
                if regex and not re.search(regex, line):
                    continue
                logs.append(line.strip())
    else:
        with open(file_path, 'r') as f:
            for line in f:
                if regex and not re.search(regex, line):
                    continue
                logs.append(line.strip())
    return logs

if __name__ == '__main__':
    app.run(debug=True)

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>日志分析工具</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
    <style>
        .log-content {
            height: 500px;
            overflow-y: scroll;
        }
    </style>
</head>
<body>

    <div class="container my-5">
        <h1 class="mb-4">日志分析工具</h1>
        <div class="row mt-3">
            <div class="col-12">
                <div class="input-group">
                    <input type="file" class="form-control" id="file-input" onchange="loadFile()">
                     <button class="btn btn-outline-secondary" type="button" onclick="loadFile()"></button>
                </div>
            </div>
        </div>

#省略200行
        
        <script>
            function loadFile() {
                const fileInput = document.getElementById('file-input');
                const file = fileInput.files[0];
                
                if (!file) {
                    alert('请选择一个文件');
                    return;
                }
                
                const reader = new FileReader();
                reader.onload = function(e) {
                    const logContent = document.getElementById('log-content');
                    logContent.innerHTML = e.target.result.replace(/\n/g, '<br>');
                };
                reader.readAsText(file);
            }

        function searchLogsbyReg() {
            const form = document.getElementById('filter-form');
            const formData = new FormData(form);
            
            fetch('/search', {
                method: 'POST',
                body: formData
            }).then(response => response.json())
                .then(data => {
                    const logContent = document.getElementById('regex');
                    logContent.innerHTML = data.join('<br>');
                });
        }
        function exportLogs() {
            const form = document.getElementById('filter-form');
            const formData = new FormData(form);
            
            fetch('/export', {
                method: 'POST',
                body: formData
            }).then(response => response.blob())
                .then(blob => {
                    const url = URL.createObjectURL(blob);
                    const link = document.createElement('a');
                    link.href = url;
                    link.setAttribute('download', 'logs.txt');
                    document.body.appendChild(link);
                    link.click();
                    document.body.removeChild(link);
                });
        }
    </script>
</body>
</html>

4.网页GUI的好处

1.无需多次编译

        我可以把它放在服务器上,不需要编译成Windows的exe,也可以让windows的同事使用;

2.更新只要一处更新

        每次迭代升级,只要更改这个python文件,再重新运行即可

3.界面更现代化

        比起PysimpleGUI的界面,浏览器看起来更高端大气上档次一点。

723cedc56a4f4c4ea226238c0a17ee45.png204b766d013246b4a86142f88019e9a8.png

如果需要完整的代码,或与我交流AI辅助编程的事情,欢迎私信我,全网同名。

69f9f604cf794cb48efdd7255dcd288f.png

 

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

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

相关文章

德人合科技|办公电脑文件资料防泄密软件

#天锐绿盾# 办公电脑文件资料防泄密软件通常具备以下几个关键功能来保障公司敏感信息的安全&#xff1a; PC端&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 1. 文件透明加密&#xff1a; 这是此类软件的核心功能之一&#xff…

vant4中如何修改Dialog弹框内容的字体大小

最近在开发一个移动端的需求&#xff0c;用的UI组件库是vant4 简单地总结一下&#xff0c;如何修改Dialog弹框内容的字体大小 我们先看一下Dialog弹框简单的使用 import { showConfirmDialog } from vant;showConfirmDialog({title: 标题,message:如果解决方法是丑陋的&#…

docker小白第十二天

docker小白第十二天 docker network简介 docker不启动时默认的网络情况。 # 停止docker服务 systemctl stop docker.socket systemctl stop docker # 查看docker镜像 docker images输入查看docker镜像命令后&#xff0c;显示未连接到docker服务器 docker启动时网络情况 sy…

Java毕业设计 基于springboot vue招聘网站 招聘系统

Java毕业设计 基于springboot vue招聘网站 招聘系统 springboot vue招聘网站 招聘系统 功能介绍 用户&#xff1a;登录 个人信息 简历信息 查看招聘信息 企业&#xff1a;登录 企业信息管理 发布招聘信息 职位招聘信息管理 简历信息管理 管理员&#xff1a;注册 登录 管理员…

【智能算法】平衡优化器(EO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.代码实现4.参考文献 1.背景 2020年&#xff0c;Afshin Faramarzi等人受到估计动态和平衡状态的控制体积质量平衡模型启发&#xff0c;提出了平衡优化器(Equilibrium Optimizer, EO)。&#xff08;PS&#xff1a;酒桶摇摇晃晃~&…

哪里找视频素材大全无水印,推荐五个超棒的视频素材网站

嘿&#xff0c;小伙伴们&#xff01;你们是不是在找视频素材大全无水印&#xff1f;别着急&#xff0c;我这就给你们推荐五个超棒的视频素材网站&#xff0c;让你的视频创作更加出彩&#xff01; 蛙学网&#xff1a;蛙学网是个适合国内创作者的好去处&#xff0c;这里有大量的视…

toapi,一个强大的 Python Web API库!

目录 前言 什么是 Python Toapi 库&#xff1f; 核心功能 使用方法 1. 安装 Toapi 库 2. 创建 Toapi 应用 3. 定义规则和过滤器 4. 运行 Toapi 应用 实际应用场景 1. 数据提取与分析 2. 自动化爬虫和数据抓取 3. 构建自定义搜索引擎 高级功能和进阶用法 1. 动态页面渲染 …

读《Cheating Depth: Enhancing 3D Surface Anomaly Detection via Depth Simulation》

WCAV2024 摘要&引言 RGB骨干&#xff1a;某些表面异常仅在RGB中实际上仍然是看不见的&#xff0c;因此需要合并三维信息&#xff08;确实重点在于“合并”&#xff0c;单纯看例子里的深度图片也看不出来异常在哪里&#xff0c;但是和rgb overlay之后就明显一些了&#xf…

【开源】SpringBoot框架开发学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

WebAssembly探索篇(三)emcc和cmake编译opencv案例

文章目录 开发环境安装opencv环境 实践出真知完整项目效果图 踩坑fatal error: opencv2/opencv.hpp file not found增加软链ln&#xff08;无效&#xff09;改用自行安装opencv&#xff0c;再显示指定lib路径 emcc命令行运行方式 最近因为项目原因&#xff0c;研究了一下WebAss…

NCV7321D11R2G收发器中文资料PDF数据手册引脚图参数图片价格芯片概述特性原理

产品概述&#xff1a; NCV7321 是一款全功能局部互联网 (LIN) 收发器&#xff0c;适用于 LIN 协议控制器和物理总线之间的接口。该收发器以 I3T 技术实施&#xff0c;可实现高电压模拟电路和数字功能在同一个芯片上的共存。NCV7321 LIN 器件属于车内联网 (IVN) 收发器系列。LI…

【鸿蒙HarmonyOS开发笔记】常用组件介绍篇 —— TextInput文本输入组件

概述 TextInput为文本输入组件&#xff0c;用于接收用户输入的文本内容。 参数 TextInput组件的参数定义如下 TextInput(value?:{placeholder?: string|Resource , text?: string|Resource})● placeholder placeholder属性用于设置无输入时的提示文本&#xff0c;效果…

基于tcp协议的网络通信(基础echo版.多进程版,多线程版,线程池版),telnet命令

目录 基础版 思路 辅助函数 服务端 代码 运行情况 -- telnet ip 端口号 传输的数据为什么没有转换格式 客户端 思路 代码 多进程版 引入 问题 解决 注意点 服务端 代码 运行情况 进程池版(简单介绍) 多线程版 引入 问题解决 注意点 服务端 代码 …

Java微服务分布式事务框架seata

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…

SSH远程连接断开后,程序继续运行

1、问题 我们在使用SSH连接远程服务器跑代码的时候&#xff0c;可能会遇到 代码需要跑很久 的情况&#xff0c;你可能会想 断开远程连接&#xff0c;但是&#xff0c;代码仍然要继续跑。 (eg: 晚上关电脑&#xff0c;但是想让代码继续跑着&#xff0c;第二天想看结果) 2、scre…

JSONP漏洞详解

目录 同源策略 JSONP简介 JSONP劫持漏洞 漏洞原理 漏洞利用过程 利用工具 JSONP漏洞挖掘思路 JSONP防御 首先&#xff0c;要了解一下什么是同源策略&#xff1f; 同源策略 同源策略&#xff08;SOP&#xff09;是浏览器的一个安全基石&#xff0c;浏览器为了保证数据…

使用 Jenkins 管道在 Docker Hub 中构建 Docker 镜像

Jenkins Pipeline 是一个强大的工具&#xff0c;可以自动执行部署。在各个阶段之间拆分的灵活和自定义操作是尝试此功能的一个很好的理由。 构建您自己的 Docker 镜像并将其上传到 Docker Hub 以保持存储库更新是了解 Jenkins Pipeline 如何改进您的工作方式的一个很好的示例。…

详细分析Python装饰器(附Demo)

目录 前言1. 基本知识2. 无参装饰器3. 有参装饰器4. 多个装饰器 前言 装饰器类似Java的切点切面增强 推荐阅读&#xff1a; 详细分析Spring中的Around注解&#xff08;附Demo&#xff09;java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff0…

如何实现Git Push之后自动部署到服务器?

在平时个人开发的过程中是不是有这样的烦恼&#xff1a; 项目开发完成&#xff0c;Push之后 登录服务器&#xff0c;手动git pull&#xff0c;然后运行部署命令 这真的很烦诶&#xff01; 那么能不能Git push之后&#xff0c;远端服务器自动 Git pull 然后运行部署命令呢&a…

内网安全之-NTLM协议详解

NTLM&#xff08;New Technology LAN Manager&#xff09;身份验证协议是微软用于Windows身份验证的主要协议之一。早起SMB协议以明文口令的形式在网络上传输&#xff0c;因此产生了安全性问题。后来出现了LM&#xff08;LAN Manager&#xff09;身份验证协议&#xff0c;它非常…