当前位置: 首页 > news >正文

240810-Gradio通过HTML组件打开本地文件+防止网页跳转到about:blank

A. 最终效果

请添加图片描述

B. 可通过鼠标点击打开文件,但会跳转到about:blank

import gradio as gr
import subprocessdef open_pptx():pptx_path = '/Users/liuguokai/Downloads/240528-工业大模型1.pptx'try:subprocess.Popen(['open', pptx_path])return "PPTX file opened successfully."except Exception as e:return f"Failed to open PPTX file. Error: {e}"with gr.Blocks() as demo:# Create a clickable HTML componenthtml_content = '<a href="javascript:void(0)" οnclick="document.getElementById(\'my_btn\').click()">Open PPTX File</a>'html_component = gr.HTML(html_content)# Create a hidden button that will be triggered by the HTML linkaction_button = gr.Button(value="Open PPTX", elem_id="my_btn", visible=False)# Link the button to the Python functionaction_button.click(open_pptx, outputs=None)demo.launch(inbrowser=True)

C. 可通过鼠标点击打开文件,且会跳转到about:blank

为了防止每次点击 HTML 组件后自动跳转到 about:blank,你可以尝试将 href="javascript:void(0)" 替换为 href="#",同时在 onclick 事件中加入 event.preventDefault(),以防止默认的跳转行为。

以下是修改后的代码:

import gradio as gr
import subprocessdef open_pptx():pptx_path = '/Users/liuguokai/Downloads/240528-工业大模型1.pptx'try:subprocess.Popen(['open', pptx_path])return "PPTX file opened successfully."except Exception as e:return f"Failed to open PPTX file. Error: {e}"with gr.Blocks() as demo:# Create a clickable HTML componenthtml_content = '''<a href="#" οnclick="event.preventDefault(); document.getElementById('my_btn').click()">Open PPTX File</a>'''html_component = gr.HTML(html_content)# Create a hidden button that will be triggered by the HTML linkaction_button = gr.Button(value="Open PPTX", elem_id="my_btn", visible=False)# Link the button to the Python functionaction_button.click(open_pptx, outputs=None)demo.launch(inbrowser=True)

说明:

  1. href="#" 可以让链接保持为一个有效的锚点,防止浏览器跳转。
  2. onclick 中加入 event.preventDefault(); 用于阻止默认的跳转行为,这样在点击 HTML 组件时就不会跳转到 about:blank,只会触发 PPTX 文件的打开操作。

这个代码改动后,你应该能够实现点击 HTML 组件后仅打开指定的 PPTX 文件,而不会跳转到空白页面。

D. 考虑不同平台兼容性后的代码

当前的代码使用 subprocess.Popen(['open', pptx_path]) 命令在 macOS 上运行。要使其兼容 Windows 和 Linux,需要根据操作系统选择不同的命令来打开文件。

以下是更新后的代码,它可以在 Windows、Linux 和 macOS 上运行:

import gradio as gr
import subprocess
import platform
import osdef open_pptx():pptx_path = '/Users/liuguokai/Downloads/240528-工业大模型1.pptx'try:if platform.system() == 'Darwin':  # macOSsubprocess.Popen(['open', pptx_path])elif platform.system() == 'Windows':  # Windowsos.startfile(pptx_path)elif platform.system() == 'Linux':  # Linuxsubprocess.Popen(['xdg-open', pptx_path])return "PPTX file opened successfully."except Exception as e:return f"Failed to open PPTX file. Error: {e}"with gr.Blocks() as demo:# Create a clickable HTML componenthtml_content = '''<a href="#" οnclick="event.preventDefault(); document.getElementById('my_btn').click()">Open PPTX File</a>'''html_component = gr.HTML(html_content)# Create a hidden button that will be triggered by the HTML linkaction_button = gr.Button(value="Open PPTX", elem_id="my_btn", visible=False)# Link the button to the Python functionaction_button.click(open_pptx, outputs=None)demo.launch(inbrowser=True)

说明:

  1. macOS: 使用 open 命令来打开文件。
  2. Windows: 使用 os.startfile 来打开文件。
  3. Linux: 使用 xdg-open 命令来打开文件,这个命令在大多数 Linux 发行版中都可以使用。

这样,代码可以在不同的操作系统上正确运行,并根据系统选择相应的命令来打开文件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux下ETCD安装、配置、命令
  • 如何让键盘F2功能键设置成重命名键(Fn+Esc)
  • SAM2部署过程中pip install -e . 报错:‘gbk‘ codec can‘t decode byte 0xa4
  • 【自动驾驶】ROS中的重名问题:工作空间、节点、参数
  • 总投资额超1320亿!上半年文旅项目投资盘点,康养/红色/智慧旅游等六大赛道受资本青睐
  • <数据集>车间工人、安全帽、安全背心识别<目标检测>
  • 九、OpenCVSharp 中的图像形态学操作
  • 【c语言】预处理、宏定义相关知识
  • 【生成式人工智能-四-chatgpt的训练过程-pretrain预训练自督导式学习督导式学习】
  • 学习008-02-05-03 Highlight Property Editors(突出显示属性编辑器)
  • 每日面试题Day2
  • 介绍ES全称Elasticsearch
  • 【搜索二维矩阵】python刷题记录
  • 用爬虫玩转石墨文档
  • cms里文章页自定义文件名去掉html方法
  • css的样式优先级
  • PAT A1017 优先队列
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 电商搜索引擎的架构设计和性能优化
  • 分布式事物理论与实践
  • 前端
  • 《码出高效》学习笔记与书中错误记录
  • 浅谈sql中的in与not in,exists与not exists的区别
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • #数据结构 笔记三
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Java)【深基9.例1】选举学生会
  • (libusb) usb口自动刷新
  • (二)JAVA使用POI操作excel
  • (二)正点原子I.MX6ULL u-boot移植
  • (分布式缓存)Redis分片集群
  • (回溯) LeetCode 77. 组合
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET 4.0中的泛型协变和反变
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET BackgroundWorker
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • ::before和::after 常见的用法
  • :“Failed to access IIS metabase”解决方法
  • :中兴通讯为何成功
  • @angular/cli项目构建--Dynamic.Form
  • [ 网络通信基础 ]——网络的传输介质(双绞线,光纤,标准,线序)
  • []AT 指令 收发短信和GPRS上网 SIM508/548