使用Python创建LNK文件选择器并导出配置文件

ops/2024/10/21 6:17:52/

在这篇博客中,我将介绍如何使用Python的wxPython库开发一个GUI应用程序,该应用程序可以选择文件夹中的.lnk快捷方式)文件,并将选中的文件导出为特定格式的buttons.ini配置文件。这个工具非常适合用来快速生成配置文件,其中包含用户选择的快捷方式,并为每个快捷方式设置特定的属性。
C:\pythoncode\new\lnkTOConfig.py

全部代码

python">import wx
import os
import win32com.clientclass LnkFileSelector(wx.Frame):def __init__(self, *args, **kw):super(LnkFileSelector, self).__init__(*args, **kw)self.InitUI()self.lnk_files = []self.selected_files = []def InitUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)hbox1 = wx.BoxSizer(wx.HORIZONTAL)self.btn_select_folder = wx.Button(panel, label="Select Folder")self.btn_select_folder.Bind(wx.EVT_BUTTON, self.OnSelectFolder)hbox1.Add(self.btn_select_folder, flag=wx.LEFT, border=10)vbox.Add(hbox1, flag=wx.EXPAND | wx.TOP | wx.BOTTOM, border=10)hbox2 = wx.BoxSizer(wx.HORIZONTAL)self.listbox1 = wx.ListBox(panel)self.listbox1.Bind(wx.EVT_LISTBOX_DCLICK, self.OnItemDoubleClick)hbox2.Add(self.listbox1, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)self.listbox2 = wx.ListBox(panel)hbox2.Add(self.listbox2, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(hbox2, proportion=1, flag=wx.EXPAND)hbox3 = wx.BoxSizer(wx.HORIZONTAL)self.btn_export = wx.Button(panel, label="Export to INI")self.btn_export.Bind(wx.EVT_BUTTON, self.OnExport)hbox3.Add(self.btn_export, flag=wx.LEFT, border=10)vbox.Add(hbox3, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)panel.SetSizer(vbox)self.SetTitle('LNK File Selector')self.Centre()def OnSelectFolder(self, event):with wx.DirDialog(self, "Choose a folder", style=wx.DD_DEFAULT_STYLE) as dirDialog:if dirDialog.ShowModal() == wx.ID_CANCEL:returnfolder_path = dirDialog.GetPath()self.lnk_files = [f for f in os.listdir(folder_path) if f.endswith('.lnk')]self.lnk_files = [os.path.join(folder_path, f) for f in self.lnk_files]self.listbox1.Set([os.path.basename(f) for f in self.lnk_files])def OnItemDoubleClick(self, event):selection = self.listbox1.GetSelection()selected_file = self.lnk_files[selection]if selected_file not in self.selected_files:self.selected_files.append(selected_file)self.listbox2.Append(os.path.basename(selected_file))def OnExport(self, event):with wx.FileDialog(self, "Save INI file", wildcard="INI files (*.ini)|*.ini",style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:returnpath = fileDialog.GetPath()self.ExportToIni(path)def ExportToIni(self, path):shell = win32com.client.Dispatch("WScript.Shell")with open(path, 'w') as file:for idx, lnk_path in enumerate(self.selected_files, start=1):shortcut = shell.CreateShortCut(lnk_path)target_path = shortcut.Targetpathcaption = os.path.splitext(os.path.basename(lnk_path))[0]file.write(f"[Button{idx}]\n")file.write(f"caption = {caption}\n")file.write(f"link = {target_path}\n")file.write("color = clGreen\n")file.write("width = 150\n")file.write("height = 70\n\n")wx.MessageBox(f"Exported {len(self.selected_files)} items to {path}", "Export Successful", wx.OK | wx.ICON_INFORMATION)if __name__ == '__main__':app = wx.App(False)frame = LnkFileSelector(None)frame.Show(True)app.MainLoop()

项目背景

在日常的Windows操作中,.lnk文件(快捷方式)经常被用来快速访问应用程序或文件。创建一个工具,让用户能够选择这些快捷方式,并将它们配置到一个INI文件中,可以大大提高管理和组织这些快捷方式的效率。

这个项目的目标是:

  1. 让用户选择一个文件夹并列出所有 .lnk 文件。
  2. 让用户从列表中选择想要配置的快捷方式
  3. 生成一个包含选中快捷方式配置文件配置文件的格式为特定的INI格式。

开发环境设置

首先,确保你的Python环境中安装了以下必要的库:

  • wxPython:用于创建图形用户界面。
  • pywin32:用于解析快捷方式文件,获取其目标路径。

你可以通过以下命令安装这些库:

pip install wxPython pywin32

应用程序的主要功能

这个应用程序主要分为以下几个功能模块:

  1. 选择文件夹并列出 .lnk 文件
    用户点击“选择文件夹”按钮后,可以选择一个文件夹,程序会自动列出该文件夹中的所有 .lnk 文件。

  2. 双击添加 .lnk 文件到配置列表
    用户可以双击 .lnk 文件,将其添加到待配置的列表中。

  3. 导出配置文件
    用户点击“导出”按钮后,程序会将选中的 .lnk 文件导出为特定格式的 buttons.ini 文件。文件中包含每个快捷方式的名称、路径以及配置属性。

代码实现

以下是实现上述功能的完整代码:

python">import wx
import os
import win32com.clientclass LnkFileSelector(wx.Frame):def __init__(self, *args, **kw):super(LnkFileSelector, self).__init__(*args, **kw)self.InitUI()self.lnk_files = []self.selected_files = []def InitUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)hbox1 = wx.BoxSizer(wx.HORIZONTAL)self.btn_select_folder = wx.Button(panel, label="Select Folder")self.btn_select_folder.Bind(wx.EVT_BUTTON, self.OnSelectFolder)hbox1.Add(self.btn_select_folder, flag=wx.LEFT, border=10)vbox.Add(hbox1, flag=wx.EXPAND | wx.TOP | wx.BOTTOM, border=10)hbox2 = wx.BoxSizer(wx.HORIZONTAL)self.listbox1 = wx.ListBox(panel)self.listbox1.Bind(wx.EVT_LISTBOX_DCLICK, self.OnItemDoubleClick)hbox2.Add(self.listbox1, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)self.listbox2 = wx.ListBox(panel)hbox2.Add(self.listbox2, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)vbox.Add(hbox2, proportion=1, flag=wx.EXPAND)hbox3 = wx.BoxSizer(wx.HORIZONTAL)self.btn_export = wx.Button(panel, label="Export to INI")self.btn_export.Bind(wx.EVT_BUTTON, self.OnExport)hbox3.Add(self.btn_export, flag=wx.LEFT, border=10)vbox.Add(hbox3, flag=wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM, border=10)panel.SetSizer(vbox)self.SetTitle('LNK File Selector')self.Centre()def OnSelectFolder(self, event):with wx.DirDialog(self, "Choose a folder", style=wx.DD_DEFAULT_STYLE) as dirDialog:if dirDialog.ShowModal() == wx.ID_CANCEL:returnfolder_path = dirDialog.GetPath()self.lnk_files = [f for f in os.listdir(folder_path) if f.endswith('.lnk')]self.lnk_files = [os.path.join(folder_path, f) for f in self.lnk_files]self.listbox1.Set([os.path.basename(f) for f in self.lnk_files])def OnItemDoubleClick(self, event):selection = self.listbox1.GetSelection()selected_file = self.lnk_files[selection]if selected_file not in self.selected_files:self.selected_files.append(selected_file)self.listbox2.Append(os.path.basename(selected_file))def OnExport(self, event):with wx.FileDialog(self, "Save INI file", wildcard="INI files (*.ini)|*.ini",style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as fileDialog:if fileDialog.ShowModal() == wx.ID_CANCEL:returnpath = fileDialog.GetPath()self.ExportToIni(path)def ExportToIni(self, path):shell = win32com.client.Dispatch("WScript.Shell")with open(path, 'w') as file:for idx, lnk_path in enumerate(self.selected_files, start=1):shortcut = shell.CreateShortCut(lnk_path)target_path = shortcut.Targetpathcaption = os.path.splitext(os.path.basename(lnk_path))[0]file.write(f"[Button{idx}]\n")file.write(f"caption = {caption}\n")file.write(f"link = {target_path}\n")file.write("color = clGreen\n")file.write("width = 150\n")file.write("height = 70\n\n")wx.MessageBox(f"Exported {len(self.selected_files)} items to {path}", "Export Successful", wx.OK | wx.ICON_INFORMATION)if __name__ == '__main__':app = wx.App(False)frame = LnkFileSelector(None)frame.Show(True)app.MainLoop()

详细功能说明

  1. 用户界面设计

    • 我们使用 wxPython 来创建一个简洁的用户界面,包含两个 ListBox,一个用于显示文件夹中的 .lnk 文件,另一个用于显示用户选择的文件。
    • “选择文件夹”按钮用于让用户选择文件夹,之后列出其中的 .lnk 文件。
    • “导出”按钮用于将用户选择的文件导出为 buttons.ini 文件。
  2. 解析 .lnk 文件

    • 使用 win32com.client.Dispatch("WScript.Shell") 创建快捷方式对象,并通过 CreateShortCut 方法获取 .lnk 文件的目标路径。
    • 通过 os.path.basename 提取 .lnk 文件名,并用作按钮的 caption
  3. 导出到 INI 文件

    • ExportToIni 方法生成 buttons.ini 文件。文件内容按照 [Button1] 的格式组织,每个按钮配置包括 caption(文件名)、link(目标路径)、colorwidthheight 等属性。

最终效果

运行程序后,用户可以轻松地选择并配置 .lnk 文件,并将这些配置导出为 buttons.ini 文件。这个文件可以用于其他应用程序进行按钮布局或快捷方式配置。

通过这个项目,你不仅可以学到 wxPython 界面开发,还可以了解如何处理和解析Windows快捷方式文件。如果你有类似的需求或项目,希望这个工具能为你提供帮助!

结果如下

在这里插入图片描述
在这里插入图片描述

总结

在这篇博客中,我们探讨了如何利用 wxPythonwin32com.client 库创建一个简单但功能强大的工具。通过这个工具,用户可以选择、配置 .lnk 文件,并导出为特定格式的 INI 文件。这不仅提高了配置文件管理的效率,也展示了 Python 在桌面应用开发中的强大功能。


http://www.ppmy.cn/ops/96876.html

相关文章

学习日志8.14--ALC(Access Control List)访问控制列表

ACL访问控制列表是一条或者多条流量规则的集合,作用主要用于流量的匹配,还可以匹配路由。通过ACL对流量加以控制,通过配合使用过滤工具,对流量进行拦截。需要注意的是ACL只是一个个匹配工具,负责匹配源IP地址、目的IP地…

mq-direct交换机

把消息分发给不同的人,不是所有人都收到 例如 已加入伙伴计划作者,发加入激励的消息,未加入伙伴计划的就发邀请的消息,不同的微服务发送不同的消息 交换机 direct交换机,要指定key,可以同时收到&#xf…

OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程

OpenDDS中,实现了Rtps_Udp传输协议(非纯udp)的可靠性传输。传输的线程包括: 1)发送方线程主要线程和定时器 《1》应用线程 《2》网络异步发送线程 《3》Heartbeat定时器 《4》Nak_response定时器 2)接收方主要线程和定时器 《1》网络异步接收线程 《2》heartbeat_respons…

【Linux】增加虚拟内存

在Ubuntu系统中,如果您需要更换或调整已挂载的swap空间大小,可以按照以下步骤进行操作: 首先,使用 free -h 或 swapon --show 命令查看当前的swap空间使用情况。 关闭当前的swap空间: sudo swapoff -v /swapfile如果s…

判断两棵树是否相等或者为镜像树

遇到一个编程题,当时没想出来,后面觉得很简单,很后悔,遗憾,记录一下。 定义一个二叉树的结构体 struct TreeNode {int value;TreeNode* left;TreeNode* right;TreeNode(int x):value(x),left(nullptr),right(nullptr)…

面试题目:(4)给表达式添加运算符

目录 题目 代码 思路解析 例子 题目 题目 给定一个仅包含数字 0-9 的字符串 num 和一个目标值整数 target &#xff0c;在 num 的数字之间添加 二元 运算符&#xff08;不是一元&#xff09;、- 或 * &#xff0c;返回 所有能够得到 target 的表达式。1 < num.length &…

7个领先数据仓库和数据库的深入比较

在当今的数字时代&#xff0c;数据仓库和数据湖已成为存储和分析大量数据的核心&#xff0c;为各种数据管理挑战提供可扩展的解决方案。探索数据仓库和数据库的多样化世界&#xff0c;比较AmazonRedshift和MySQL等主要参与者&#xff0c;以确定最适合您的数据管理需求的解决方案…

SQL - 汇总与分组

聚合函数 MySQL自带一堆内置函数&#xff0c;其中一些叫聚合函数&#xff0c;用它们汇总数据&#xff0c;因为它们取某一列的值并聚合它们&#xff0c;导出一个单一值。并且聚合函数只会运行非空值&#xff0c;如果列中有的值是null&#xff0c;它不会被算在内。 max(), min(),…