在这篇博客中,我将介绍如何使用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文件中,可以大大提高管理和组织这些快捷方式的效率。
这个项目的目标是:
- 让用户选择一个文件夹并列出所有
.lnk
文件。 - 让用户从列表中选择想要配置的快捷方式。
- 生成一个包含选中快捷方式的配置文件,配置文件的格式为特定的INI格式。
开发环境设置
首先,确保你的Python环境中安装了以下必要的库:
wxPython
:用于创建图形用户界面。pywin32
:用于解析快捷方式文件,获取其目标路径。
你可以通过以下命令安装这些库:
pip install wxPython pywin32
应用程序的主要功能
这个应用程序主要分为以下几个功能模块:
-
选择文件夹并列出
.lnk
文件:
用户点击“选择文件夹”按钮后,可以选择一个文件夹,程序会自动列出该文件夹中的所有.lnk
文件。 -
双击添加
.lnk
文件到配置列表:
用户可以双击.lnk
文件,将其添加到待配置的列表中。 -
导出配置文件:
用户点击“导出”按钮后,程序会将选中的.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()
详细功能说明
-
用户界面设计:
- 我们使用
wxPython
来创建一个简洁的用户界面,包含两个ListBox
,一个用于显示文件夹中的.lnk
文件,另一个用于显示用户选择的文件。 - “选择文件夹”按钮用于让用户选择文件夹,之后列出其中的
.lnk
文件。 - “导出”按钮用于将用户选择的文件导出为
buttons.ini
文件。
- 我们使用
-
解析
.lnk
文件:- 使用
win32com.client.Dispatch("WScript.Shell")
创建快捷方式对象,并通过CreateShortCut
方法获取.lnk
文件的目标路径。 - 通过
os.path.basename
提取.lnk
文件名,并用作按钮的caption
。
- 使用
-
导出到 INI 文件:
ExportToIni
方法生成buttons.ini
文件。文件内容按照[Button1]
的格式组织,每个按钮配置包括caption
(文件名)、link
(目标路径)、color
、width
和height
等属性。
最终效果
运行程序后,用户可以轻松地选择并配置 .lnk
文件,并将这些配置导出为 buttons.ini
文件。这个文件可以用于其他应用程序进行按钮布局或快捷方式配置。
通过这个项目,你不仅可以学到 wxPython
界面开发,还可以了解如何处理和解析Windows快捷方式文件。如果你有类似的需求或项目,希望这个工具能为你提供帮助!
结果如下
总结
在这篇博客中,我们探讨了如何利用 wxPython
和 win32com.client
库创建一个简单但功能强大的工具。通过这个工具,用户可以选择、配置 .lnk
文件,并导出为特定格式的 INI
文件。这不仅提高了配置文件管理的效率,也展示了 Python 在桌面应用开发中的强大功能。