rare-cheesecakeの日記

主に技術情報を不定期更新していきます。今注目しているのはPythonとDevOpsです。

Pythonでコマンドランチャーを作ってみた

会社のマシンのデスクトップやらショートカットやらを整理していると、ふとコマンドランチャーが欲しくなりましたのでPythonで作ってみることにしました。

wxPythonとosを使用しています。

 

まずは最低限の機能を実装

・パスを入力するとリストにパス以下のファイル一覧を表示。

・リストのディレクトリを選択し、Tabキーを押すと入力欄に追加。

・リストのファイルを選択し、Enterキーを押すと、ディレクトリならエクスプローラを、ファイルなら実行する。

# !/usr/bin/env python
# coding:utf-8

import os
import wx

class CmdLauncher(wx.Frame):

	def __init__(self, parent, title):
		self.List = []
		Frm = wx.Frame(None, -1, "CmdLauncher", size=(400,50),pos=(400,400))
		self.TxtCtr = wx.TextCtrl(Frm, -1)
		self.TxtCtr.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
		self.lbFrame = wx.Frame(None, 0, "wxPython", size=(420,200),pos=(400,448),style=wx.DOUBLE_BORDER)
        	self.LBox = wx.ListBox(self.lbFrame, -1, choices = self.List, size=(415,200))
		Frm.Show()
		self.TxtCtr.SetFocus()

	def OnKeyDown(self,event):
		key = event.GetKeyCode()
		input = self.TxtCtr.GetValue()
		input = os.path.normpath(os.path.normcase(input))
		select = self.LBox.GetStringSelection()
		if key ==  wx.WXK_ESCAPE:
			wx.Exit()
		elif key == wx.WXK_TAB:
			self.TxtCtr.Clear()
			self.TxtCtr.SetValue(select)
			self.TxtCtr.SetFocus()
		elif key == wx.WXK_UP:
			count = self.LBox.GetCount()
			next = self.LBox.GetSelection() - 1
			if next >=  0:
				self.LBox.SetSelection(next)
			else: self.LBox.SetSelection(count - 1)
		elif key == wx.WXK_DOWN:
			count = self.LBox.GetCount()
			next = self.LBox.GetSelection() + 1
			if next < count:
				self.LBox.SetSelection(next)
			else: self.LBox.SetSelection(0)
		elif key == wx.WXK_RETURN:
			self.TxtCtr.Clear()
			self.TxtCtr.SetValue(select)
			self.lbFrame.Hide()
			if os.path.isdir(select) :
				os.system("explorer " + select)
			else:
				os.system(select)
		else:
			if input != "" and os.path.exists(input) :
				if SearchExist(self, input):
					event.Skip()
				else:
					self.LBox.Clear()
					self.lbFrame.Show()
					files = os.listdir(input)
					for file in files:
						if os.path.isdir(file):
							self.LBox.Append(input + os.sep + file + os.sep)
						else:
							self.LBox.Append(input + os.sep + file)
					self.TxtCtr.SetFocus()
					event.Skip()
			else:
				event.Skip()

def SearchExist(self, target):
	for i in self.LBox.GetItems():
		if i == target :
			return True

def main():
	app = wx.App(False)
        launcher = CmdLauncher(None, 'My CmdLauncher')
	app.MainLoop()

if __name__ == '__main__':
    main()

※現状は最初にドライブ文字「C:\」を入力する必要があります。

 
細かい機能は随時実装していこう。