首页 > 编程语言 >Node打开选择文件夹弹框

Node打开选择文件夹弹框

时间:2024-04-02 19:34:56浏览次数:31  
标签:Node 文件 exe stdout python 弹框 文件夹 import

Node打开选择文件夹弹框

发布于 2023-03-29 10:39:12 2.7K0 举报 文章被收录于专栏:clz

Node打开选择文件夹弹框

前言

用脚手架的那套东西写了一个工具,但是想要一个用Node去打开选择文件夹弹框的效果,来设置操作根目录。但是,Node本身没有这个API。

node执行python脚本

Node本身没有提供打开选择文件夹弹框的API,但是Python的tkinter是有这个功能的。所以可以用Python写好脚本来打开选择文件夹,然后通过Node来执行python脚本。

Python脚本也是非常的简单。

import tkinter as tk
import tkinter.filedialog

dirPaths = tkinter.filedialog.askdirectory()

if(len(dirPaths) == 0):
  print('None')
else:
  print(dirPaths)

 

Node执行Python脚本需要通过Node提供的child_process来创建子进程(exec),它会将紫禁城的输入以回调函数参数的形式一次性返回。

ESM里使用__dirname

因为我用的是ESM模式写的,所以是不能直接使用__dirname的。这里稍微吹一下下ChatGPT。

启用ESM模式则是在package.json中,添加type: "module"

当然,答案有点小瑕疵,实际上得到的是当前文件的绝对地址,并且前面会有文件协议。所以需要进行一些处理。

代码

import { exec } from 'child_process';
import { EOL } from 'os';  // 回车、换行,通过JSON.stringify()能够观测到
import path from 'path';

const dirname = import.meta.url.slice(8, import.meta.url.lastIndexOf('/'));

const p = new Promise((resolve, reject) => {
  exec(path.join(dirname, 'dialog.py'), (err, stdout, stderr) => {
    if (err) {
      reject(new Error(err));
    } else if (stderr) {
      reject(new Error(stderr));
    } else if (stdout) {
      const result = stdout.trim().split(EOL).toString();  // 将返回的结果去掉前后的空格以及回车换行
      resolve(result);
    }
  })
});

p.then(val => {
    console.log(val);
})

 

中文路径问题

python输出中文是会乱码的,所以当我们选择的路径有中文的话,就会出现问题。

在网上找到一些解决方案说是改环境变量。但是,本人想要的效果是只需要下载工具,就能直接使用。而不需要手动修改。所以最好的方案还是在代码上做文章。

最后,功夫不负有心人。找到一个改变标准输入输出的默认编码的方案。

import io
import sys

#改变标准输出的默认编码
sys.stdout= io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')

 

所以,需要小修改Python代码,添加上面的内容。

将python程序打包成exe文件

上面通过Node来执行python脚本,实际上是需要电脑有安装Python,但是这样子当然是不太好的,有种捆绑的感觉。和Python的耦合度过高,所以最终考虑将python程序打包成exe文件。

py打包为exe文件需要依赖pyinstaller

更多:如何将python程序打包成exe文件_py打包成exe_一朝乐的博客-CSDN博客

安装pyinstaller可能会遇到的问题以及解决方案:

如何将python程序打包成exe文件_py打包成exe_一朝乐的博客-CSDN博客

除了dist外,生成的东西都能删掉,因为其他都是都是编译的时候生成的。只有dist是我们有我们想要的exe文件。

直接双击生成的exe文件,也会打开选择文件夹弹框。

代码也需要修改成执行exe文件,而不再是python文件。

import { exec } from 'child_process';
import { EOL } from 'os';  // 回车、换行,通过JSON.stringify()能够观测到
import path from 'path';

const dirname = import.meta.url.slice(8, import.meta.url.lastIndexOf('/'));

const p = new Promise((resolve, reject) => {
  exec(path.join(dirname, 'dist', 'dialog.exe'), (err, stdout, stderr) => {
    if (err) {
      reject(new Error(err));
    } else if (stderr) {
      reject(new Error(stderr));
    } else if (stdout) {
      const result = stdout.trim().split(EOL).toString();  // 将返回的结果去掉前后的空格以及回车换行
      resolve(result);
    }
  })
});

p.then(val => {
    console.log(val);
})

 

效果和前面一样。

还可以编写一个sh文件,帮我们生成exe文件,并且删除编译中生成的一些其他文件。

run.sh

#!/bin/bash
pyinstaller -F dialog.py
rm build/ -rf
rm dialog.specs
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。 原始发表:2023-03-22,如有侵权请联系 [email protected] 删除

标签:Node,文件,exe,stdout,python,弹框,文件夹,import
From: https://www.cnblogs.com/sexintercourse/p/18111349

相关文章

  • nvm安装node
    一、安装nvmlinux安装编辑文件/etc/hosts199.232.68.133raw.githubusercontent.com199.232.68.133user-images.githubusercontent.com199.232.68.133avatars2.githubusercontent.com199.232.68.133avatars1.githubusercontent.com新增上面这一步的目的是为了避免出......
  • nodejs在谷歌浏览器中调试
    一.浏览器开启实验室模式在谷歌浏览器中输入网址<chrome://flags/>,进入页面后打开该功能。二.配置js文件我用的是pycharm,首先对需要调试的js文件进行配置,然后填入--inspect-brk三.调试jsDebugger要调试的js文件,然后在谷歌浏览器中新打开一个标签页,打开开发者工具,等待nod......
  • nodeJs 实现视频的转换(超详细教程)
    前段时间拿到一个视频是4k的,没法播放,于是通过node.js  和 ffmpeg实现了视频的转换。在win10系统下实现。所需工具node16.19直接安装ffmpeg-5.1.1-essentials_build解压后重名ffmpeg放到C盘然后配置下环境变量Git-2.42.0.2-64-bit直接安装安装完建一个demo......
  • nvm管理node版本后手动安装npm包管理
    在命令行npm检查检查过node后,输入指令npm-v来检查npm是否安装成功。毕竟node8以上的版本,就不支持npm的自动安装了。如果显示npm版本号,说明npm也安装成功。如果显示npm非内部指令或外部指令等字样,说明npm并没有自动安装。npm安装失败的处理失败的原因很简单。如果正......
  • nodejs websocket
    github:库地址node后端:interfacemsgType{from:string;to:string;msg:string;}exportclassServer{privatews=require("nodejs-websocket");privateconnections:{nickname:string;con:any}[]=[];constructor(){this.sta......
  • 使用node更加方便的操作mysql数据库的小工具
    这是一个自己封装的小工具,能够更加方便的操作数据库地址:工具首页git仓库地址功能还在继续开发当中…安装npminstallmysqinfo已经引入mysql工具包,无需在项目中再次引入mysql工具包导入constdb=require('mysqinfo')获取数据库对象//db.dbconnect('m......
  • Node.js毕业设计基于HarmonyOS在线学习平台app(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的迅猛发展,移动应用已经成为了人们获取信息、学习知识的重要渠道。在线学习平台作为现代教育技术的重要组成部分,为人们提供了便捷的学习途径......
  • Node.js毕业设计基于HarmonyOS的门诊预约平台(Express+附源码)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:随着科技的不断发展,互联网已经深入到我们生活的方方面面,特别是在医疗领域,互联网技术的应用使得医疗服务变得更加便捷和高效。然而,尽管互联网医疗的发展势头......
  • node
    node中自带的包events事件发射器http创建一个服务global对象默认this是空对象与global不同__filename__dirnameprocess对象常用process.cwd()process.envprocess.stdout.write(data):将数据写入标准输出流(通常是控制台)。process.stderr.write(data):将数据写入标准......
  • 如何在Node.js中使用Express直接上传客户端文件到MinIO?
    如何在Node.js中使用Express直接上传客户端文件到MinIO?在Node.js中使用MinIO的前提是已经安装并进行了相关设置。在此基础上,需要引入MinIO的SDK,通过它实现客户端文件上传。以下代码示例演示了如何通过Express 直接从客户端上传文件到MinIO:constexpress=requir......