使用python快速开发桌面小工具

使用python快速开发桌面小工具参考链接WelcometoPython.orgExtendingandEmbeddingthePythonInterpreter—Python3.7.3documentation起因更重要在日常开发中,总需要一些普通的小工具。小工具嘛,要得急,写得也急,总有很多不完善的问题,频繁修改成了一个较大的问题。比如之前用c#写了一个将excel表自动转成csv文本的工具,…

大家好,又见面了,我是你们的朋友全栈君。

参考链接

起因更重要

在日常开发中,总需要一些普通的小工具。小工具嘛,要得急,写得也急,总有很多不完善的问题,频繁修改成了一个较大的问题。比如之前用c#写了一个将excel表自动转成csv文本的工具,后面需要一个转为Tab分割的文本,本来也就是改一点小东西,重新编译一下就可以,但是工程不小心丢了,确实比较尴尬了。

需求更实际

  • 可以随手修改一些小bug,所以准备使用python脚本,lua也值得考虑,不过桌面上的功能不及python强大
  • 工具可以直接运行,不需要在非程序员的电脑里面也安装一个python环境,所以使用了C++内嵌一个python解释器
  • 能方便扩展,准备动态支持python的一些第三方库

实现步骤

  • 使用visual studio创建一个C++的工程。这工程可以随意丢弃,因为生成玩一次就基本可以不用再打开了
  • 开发电脑上还是需要安装python的环境的,因为C++要使用到Python.h头文件,以及python.lib静态库
  • 下载Windows x86-64 embeddable zip file,https://www.python.org/ftp/python/3.7.3/python-3.7.3-embed-amd64.zip
  • 编辑main.cpp文件,点击Release生成。
#include <iostream>
#include "Python.h"
int main(int argc,char *args[])
{

	const std::wstring path = L"python37.zip;site-packages;";
	Py_SetPath(path.c_str());
	Py_Initialize();


	const char* pyFile = "main.py";
	//取外部python文件
	if (argc > 1)
	{
		pyFile = args[1];
	}

	PyObject *obj = Py_BuildValue("s", pyFile);
	FILE *fp = _Py_fopen_obj(obj, "r");
	if (fp == NULL)
		return 1;
	PyRun_SimpleFile(fp, pyFile);

	Py_Finalize();

	return 0;

}
  • 将生成的exe以及python37.zip,拷贝到一个文件夹中,同时在文件夹下创建一个site-packages文件夹用来存第三方的库,一个开发工具就已经完成了。

使用测试

  • 安装第三方库,其实我并没有找到很好的解决方案,只有在开发机的python环境中,安装好第三方库,然后将Lib\site-packages里面想使用的库拷贝到site-packages文件夹下,比如我这里就使用了wxpython的库
  • 这里就开始编写python脚本了,创建一个UploadEditor.py脚本,里面就使用了wxpython实现了一个简单的界面
import wx
from shutil import copyfile
import os
import uuid

#上传编辑器
class UploadEditor(wx.Frame):

    def __init__(self, *args, **kw):
        super(UploadEditor,self).__init__(*args, **kw)

        pnl=wx.Panel(self)
        self.textCtrl = wx.TextCtrl(pnl,wx.ID_ANY,value="",pos=(3,5),size=(375,160),style=wx.TE_READONLY|wx.TE_NOHIDESEL|wx.TE_MULTILINE) 
        # textCtrl.IsMultiLine=true

        #菜单栏
        self.MakeMenuBar()
        #状态栏
        self.CreateStatusBar()
        self.SetStatusText("\\\\win-yjtlopmtrcn -- Administrator:Asd997asd")

    #创建菜单栏
    def MakeMenuBar(self):
        fileMenu=wx.Menu()
        openItem = fileMenu.Append(-1,"Open")
        exitItem = fileMenu.Append(wx.ID_EXIT)

        #创建菜单栏
        menuBar=wx.MenuBar()
        menuBar.Append(fileMenu,"&File")

        #设置菜单栏
        self.SetMenuBar(menuBar)

        #绑定事件
        self.Bind(wx.EVT_MENU,self.OnExit,exitItem)
        self.Bind(wx.EVT_MENU,self.OnOpen,openItem)


    #退出事件
    def OnExit(self,event):
        self.Close(True)

    #打开事件
    def OnOpen(self,event):
          # otherwise ask the user what new file to open
        with wx.FileDialog(self, "Open image file", wildcard="image files (*.jpg;*.png;*.gif)|*.jpg;*.png;*.gif",
                       style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST| wx.FD_MULTIPLE) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return     # the user changed their mind

            # Proceed loading the file chosen by the user
            paths = fileDialog.GetPaths()
            #更新名称的文件集合
            mdPaths=[]
            self.textCtrl.flush()
            for pathName in paths:
                try:
                    newFile = self.CopyFiles(pathName)
                    mdPaths.append(newFile)
                    mdPath="!["+os.path.basename(pathName)+"]("+newFile+")";
                    self.textCtrl.write(mdPath+"\n\n")
                except IOError:
                    wx.LogError("Cannot open file '%s'." % newfile)

    #复制文件
    def CopyFiles(self,filePath):
        ext=os.path.splitext(filePath)[1]
        filePath=os.path.abspath(filePath)
        fileName=str(uuid.uuid1())+ext
        #目录路径
        targetPath=os.path.join("\\\\win-yjtlopmtrcn\\load\\images",fileName)
        #copyfile(filePath,targetPath)
        #复制文件 windows xcopy命令
        os.system("copy \""+filePath+"\" \""+targetPath+"\" /Y")
        #mdPath=os.path.join("http://win-yjtlopmtrcn/load/images",fileName)
        mdPath="http://win-yjtlopmtrcn/load/images/"+fileName
        return mdPath
            

  • 然后创建一个main.py文件
import wx
from UploadEditor import UploadEditor 


app= wx.App()

frm= UploadEditor(None,title="图片上传工具")

frm.Show()

app.MainLoop()
  • 目录结构
    在这里插入图片描述
  • 双击exe或者使用命令EPython.exe main.py就可以正常运行
  • 运行展示
    在这里插入图片描述
  • 不爽的地方就是wxpython的库太大了,80M,不使用wxpython最多几M。不过基本逻辑没有问题,借助这种方式可以快速修改或者开发小工具了。

工具链接

  • https://download.csdn.net/download/qq992817263/11143794
  • 有兴趣的可以试一试这个工具,如果上传图片失败,可能需要更改一点python脚本,原来上传图片的地址,是本地局域网的地址,可以改成自己本机的地址。
  • 另外csdn的资源管理,不知道是怎么回事,上传的资源自动判断分数,本来没想收积分的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143854.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • discuz整站搬家

    discuz整站搬家网站建设中难免遇到要更换服务器和站点搬家,这里分享下  1、首先我们需要登录DZ论坛后台,在全局设置里边,关闭站点,防止网站出现新数据导致备份数据不完整。如图:  2、后台-站长,点击数据库,按照提示,选择备份类型,点击提交开始进行备份。  3、备份完成之后我们可以看到如下图。  4、接下来我们需要把整个网站进行压缩打包,打包完成之后把压缩包…

    2022年7月17日
  • Windows环境安装MySQL server「建议收藏」

    Windows环境安装MySQL server「建议收藏」从MySQL官网下载安装包,下载CommunityServer的zip即可,如mysql-5.7.23-winx64.zip,也可以下载Installer版,这里说的是CommunityServer版。把下载好的zip包解压到一个合适的位置,本文给出的命令是基于解压在D:\mysql-5.7.23-winx64下。在安装之前检测一下当前环境是否有VS环境,没有的话去微软官网下一个Visua…

    2022年9月14日
  • 谷歌创始人是谁_谷歌创始人的故事

    谷歌创始人是谁_谷歌创始人的故事·布林更多的关注。最新一期的《莫斯科新闻》称,如果举世瞩目的诺贝尔奖设有IT奖的话,这位脸上总是挂着招牌式微笑的年轻人注定是该奖项最有竞争力的人选。他创建的Google成为人们使用互联网的一种重要方式,使每个人与很多问题的答案之间只有点击一下鼠标那么远,Google正像当年的甲壳虫乐队那样风靡全球。  谢尔盖·布林出生在前苏联一个犹太人家庭。5岁那年,布林跟随父母一起移民美国,从而开始了他美

    2022年9月1日
  • awvs无法启动问题

    awvs无法启动问题awvs作为一个自动化漏扫工具,话说挺好用的,刚开始用的awvs11,用的还行,就是报告里报文啥的不好操作,然后去年下载了awvs13准备安装使用,结果,结果,试了n次,都是无法使用试了网上好多解决教程,重启服务等等,还是不行,那时候果断放弃了,今天突然想把awvs,burp和xray结合起来使用,就又开始安装折腾awvs14,试了三次,果不其然,不行突然发现我的计算机名字是中文,awvs14不支持计算机名为中文,啊,改改改。…

    2022年9月22日
  • 我的世界java版需要多少钱_我的世界Java版20w49a快照版[通俗易懂]

    我的世界java版需要多少钱_我的世界Java版20w49a快照版[通俗易懂]我的世界Java版20w49a快照版游戏是我的世界最新版本游戏,更新了许多新颖独特的元素,超大的地图世界可以自由探索,全新的故事情节完美融入其中,各种各样的玩法让你无限制的去毛线,全新的世界带给你不一样的欢乐。喜欢我的世界的玩家不要错过哦!我的世界Java版20w49a快照版游戏简介1、玩家可以探索去寻找一些稀有的水晶,这些水晶的种类有很多,收集这些资源即可让你建造出更多有意思的内容;2、全新的家…

    2022年7月7日
  • 用导数的定义求指数函数的导数_对数函数导数的推导

    用导数的定义求指数函数的导数_对数函数导数的推导指数函数的性质  先来复习一下中学的课程:指数函数的导数  对f(x)=ax求导:  ax右侧的那个极限似乎没有办法继续简化了,如果这个极限看作关于a的函数(之所以将极限看作关于a的函数,是因为在这个极限中,a是未知的,Δx是已知的):  函数在某一点导数的几何意义是该点处切线的斜率,所以M(a)也就是ax在x=0处切线的斜率。  如果y=2x,…

    2022年10月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号