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

 更新时间:2025年01月23日 11:02:59   作者:winfredzhang  
在这篇博客中,我将介绍如何使用Python的wxPython库开发一个GUI应用程序,该应用程序可以选择文件夹中的.lnk(快捷方式)文件,并将选中的文件导出为特定格式的buttons.ini配置文件,需要的朋友可以参考下

引言

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

C:\pythoncode\new\lnkTOConfig.py

全部代码

import wx
import os
import win32com.client

class 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:
                return

            folder_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:
                return

            path = 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.Targetpath
                caption = 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 文件。文件中包含每个快捷方式的名称、路径以及配置属性。

代码实现

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

import wx
import os
import win32com.client

class 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:
                return

            folder_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:
                return

            path = 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.Targetpath
                caption = 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(目标路径)、colorwidth 和 height 等属性。

最终效果

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

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

结果如下

总结

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

以上就是使用Python创建LNK文件选择器并导出配置文件的详细内容,更多关于Python创建LNK文件选择器的资料请关注脚本之家其它相关文章!

相关文章

  • Python+pandas计算数据相关系数的实例

    Python+pandas计算数据相关系数的实例

    今天小编就为大家分享一篇Python+pandas计算数据相关系数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python实现抓取HTML网页并以PDF文件形式保存的方法

    Python实现抓取HTML网页并以PDF文件形式保存的方法

    这篇文章主要介绍了Python实现抓取HTML网页并以PDF文件形式保存的方法,结合实例形式分析了PyPDF2模块的安装及Python抓取HTML页面并基于PyPDF2模块生成pdf文件的相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Python练习之读取XML节点和属性值的方法

    Python练习之读取XML节点和属性值的方法

    这篇文章主要介绍了Python练习之读取XML节点和属性值的方法,通过parse函数可以读取XML文档,该函数返回ElementTree类型的对象,通过该对象的iterfind方法可以对XML中特定节点进行迭代
    2022-06-06
  • 关于Numpy中的行向量和列向量详解

    关于Numpy中的行向量和列向量详解

    今天小编就为大家分享一篇关于Numpy中的行向量和列向量详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python中__slots__用法实例

    python中__slots__用法实例

    这篇文章主要介绍了python中__slots__用法,实例分析了__slots__的功能与相关使用技巧,需要的朋友可以参考下
    2015-06-06
  • Kwargs传递给Python 中的另一个函数实现方法

    Kwargs传递给Python 中的另一个函数实现方法

    Python 列出了可以传递给程序中的函数的两种类型的参数, 非关键字参数**args和关键字参数 **kwargs ,在本文中,我们将讨论如何使用关键字参数及如何将关键字参数传递给另一个函数,感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • 基于Python的PIL库学习详解

    基于Python的PIL库学习详解

    这篇文章主要介绍了基于Python的PIL库学习详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 利用python实现货币识别功能

    利用python实现货币识别功能

    本文的目的是介绍如何利用Python实现货币识别技术,随着经济的发展和国际贸易的增加,货币的种类越来越多,本文将介绍货币识别的基本原理、实现过程以及代码实现,感兴趣的朋友可以参考下
    2024-01-01
  • Python 正则表达式(转义问题)

    Python 正则表达式(转义问题)

    这篇文章主要介绍了Python 正则表达式(转义问题),需要的朋友可以参考下
    2014-12-12
  • python构造IP报文实例

    python构造IP报文实例

    这篇文章主要介绍了python构造IP报文实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05

最新评论